PS2 LinuxJ[lpDMApb`

 v

                  10                  2021

  Җ]PlayStation 2 Linux(ȌAPS2
LinuxƗ)łBF񂳂lXȎg
Ă悤łB
  PS2̃n[hEGA𒼐ڑ삵ăO
tBbNŗVтƎv܂B
  {eł̖͂ړIɓs悤ɃJ[l
ɎĂ݂܂B

 PS2̃A[LeN`


  ŏɁA{IPS23DOtBbN\
邽߂̃A[LeN`ɂĐ
B
  PS2͓Ƃ悭܂BɃv
O~O͒PƂ͂܂񂪁AA[L
eN`̂̂͂肵ĂƎv
B
  EE Core,VPU1,GS֌WȒPɂ܂Ƃ߂u
bN}}1Ɏ܂B
  PS2ɂGSɂăOtBbN\
邽߂̕@ƂẮA傫ނ
2̕@܂B
  1́AEE CoreVPU0pēϊ
܂ōs2Df[^߃ɔzuA
DMApGS֓]@łB
  1̕@́AEE Coreł3D̒_f[
^܂͒_f[^쐬邽߂̃qg
Ȃ݂̂߂ăɔzuA
ƂVPU1ŏ̂łB
VPU1֒ڃf[^]AVPU1łGS
̕`f[^𐶐ĒGS𓮍삳܂B
  ҂͓Ɏgp邱Ƃł܂(1)B

  EE Core̎sƁADMAɂVPU1, GSւ̓]
ɓ삵܂(2)B ʏ́ADMA
]f[^i[郁_uob
t@ƂA1t[(3)̕`撆DMA]
sAEE Coreł͎̃t[̂߂DMA
pf[^쐬܂(4)B

  āA1t[ɂDMA]VPU1,
GSɂʕ`AEE Coreɂ鎟̃t[
DMA]̂߂̃f[^쐬sčs
邱ƂɂȂ܂B
  }2ɂ̃C[W}܂B

  āA1t[̕`悲ƂDMA]
f[^ʂ́AɖcȂ̂ɂȂ܂BPS2
V-RAM͂܂傫Ȃ߁ApɂɃeN
X`ւ܂A1t[
`V-RAM̓e͉xSɓꊷ
܂BȂ킿A1t[`悷邽
ɁADMA͕KvȑSẴf[^]Ȃ
΂Ȃ܂B
  ȂAf̒_f[^Ae
NX`͊et[ŋʂĎgp邽
߁ADMAf[^쐬̂߂DMAobt@
f[^ݒ肷͖̂ʂȍƂł傤B
  PS2ł́Â悤Ȗ̉̂߂ɁA
DMÃ[hƂChain ModepӂĂ
܂BłSource Chain Mode͓]f
[^̍ŏɕKTaguƂœ]
𐧌䂷邱Ƃł܂B
  DMATag̎ނɂ́A\1̂悤Ȏނ
܂̂ŁAlXȗv܂ł܂B
  āAPS2ł́ADMATag̍l͐
ɐ荞܂ĂAGSւ̃pPbgɂA
VPU1ւ̃pPbgɂKTagt܂B
  Tag͂ꂼAGIF, VIF߂Af[^
̃fR[h]̑IƂAׂ
𐧌䂵܂B
  āA`l䃌WX^Dn_CHCR̃rb
g6ɂTTErbgƂ̂Ãrb
g𗧂ĂDMA Tagg]ytF
֓]܂B
  TTErbǵAVPU1ւ̃f[^]
ɂĈЗ͂𔭊܂B

  Ⴆ΁AVPU1֒_f[^nƂ̂
lĂ݂܂B
  Cɂ͒_f[^̔z񂪂
܂BʏÂ悤ȏꍇɂDMAref
gVPU֏]邱ƂɂȂ܂B
  ̏ꍇAVIFւ͐VIF CODEnKv
܂BATTEpƁADMA Tag
̂̋󂫗̈64bitVIF CODE𖄂ߍނ
Ƃł̂DMA]悭Ƃ
ł܂B(}3Q)

 PS2 Linuxł̃vO~ODMA̎


  āAPS2 Linux̘bɈڂ܂傤B
  PS2 LinuxŎۂɃvO~Os
A}4x[XƂ悤ȍ\
\ɂȂł傤B
  ̐lƂƎv̂łA
̏ꍇɘRꂸAlpL[u\
vOĂ݂邱Ƃɂ
B
  Ƃ낪AۂɎn߂Ă݂libps2dev
DMA̋@\ɏȂƂɋCt܂B
TTE=1̗L͏dvŁAꂪ̂Ƃ
̂ł͑傫vO~O̕jς
Ă܂܂B
  䖝ĎgƂl̂łA
LinuxȂ񂾂A\[X͑SĂ邱
łA邱Ƃɂ܂B
  ŏTTE=1ȂΊȒPɒǉł邾
낤ƍlĂ̂łAۂɉ͂͂
߂ƁAȂꂽƂ܂B
DMAX^[g֐łps2_dma_start()̎
łBȂƁASource Chain ModeDMA tag
S\tgEGAŉ߂Ă܂B
@mɎۂDMAJnioctl()ɂ
Chain ModeDMA]܂BJ[l
̃hCõ\[XǂłƋCt
̂łAɓO̖{IȐłB
  PS2 Linux̊JS҂͂̂悤Ȏ
sɂAȂY񂾂̂ł͂ȂƑz
܂B

  Linux͉zLʂOSłB
  DMARg[ɂ̓AhXƂāA
zAhXł͂ȂAAhXnK
v܂Bzԏł͘AĂ郁
ԂłAIɂ̓y[WTCYP
ɕĂAzuoołB
  Oq̒ʂAPS2 Linux́AhCox
ł̓m[}[hȊODMA͖AA
f[^̓]݂̂Ă܂B
  ioctl()sDMA]̗v󂯎
ƁAhCoł̓f[^]y[WPʂ
؂ĕ܂BDMA]Normal Mode
jAȓ]v܂񂩂炱͊
PłB
  āAy[WPʂőΉ镨AhX
߁AŌɃy[W̐DMAref^O
ׂāA1̃\[X`FC[hDMA
s܂B
  ȏ̂悤ȗŁAzԏDMA]
Ă܂B
  Chain Mode̓\tgEGAłׂĂ
邽߂ɁA[U͔ς킵AhXԂ
ႢɂƂꂸAׂĂzAhXŏ
邱Ƃł܂B

  ƂŁÂ悤ȎȂPS2 Linux
ł͕ʂmalloc()f[^Ȃǂł
]łłAۂɂ́A
/dev/ps2memmmap()ămۂȂ
Ă͂Ȃ܂񂵁Amalloc()f[^́A
hCoŊmۂ̈֓]Ă
DMA]s邽߁Aɒ[ɑxx
Ă܂܂B
  ̂̂悤ɂȂĂ̂ł傤H
  ́Ay[WPʂőΉ镨AhX
߂Ƃ낪~\ŁA/dev/ps2memŊmۂ
y[Wfile\̃o
private_dataɕAhXĂA
DMA]ɂ͂QƂĂ̂łB

  PS2 LinuxDMAA[LeN`ȏ̂悤
ɎĂ܂A͎ɏȉ
@łB
  ŔA/dev/ps2memŊmۂ郁̈
́Âǂ̂炢Kvł邩lƖ
炩łB
  ɒuׂf[^͖cȐÓIȃeNX
`f[^Af̃f[^ȂǂłA܂
EE̐DMAŎQƂ邱Ƃ̂铮I
ȃf[^ׂĊ܂܂邱ƂɂȂł傤B
  PS2̃p[ő߂ɂ10MB
炢Ώ\Ȃ̂ł傤H
  AQ[ɂĂ̓f[^9ȏオ
\pf[^Ǝv܂AƕKv
ł傤BɂPS2̃Q[Jo
܂A̎20MB͊yɉzĂ悤
LĂ܂B
  XŎg͂ǂł傤BGSǂ
Ă̂\[X͑SĂȂ̂ō
킯ł͂܂񂪁AƌƂA
1MBgĂȂ悤Ɍ܂B
  ȏ̂悤ɁAƌςł1MB
`20MBƕL̎gpʂ͕ω܂A
PS2̓ڃʂ32MBłA]T͂
܂BIȃmۂK{ƂȂł
傤B

  āADMAŎgp郁͕IɘA
ĂKv܂B
  LinuxŘAmۂ֐
ƂẮAget_free_pages()܂A
ő128KBłAꂱړIɎgp
ł̂ł͂܂BɂȂA
Ĉ悳łA
eՂł͂܂B
  AzԂɃ}bvꂽ
Ƃ̂͋NȂ΂ƂA
oɂČΉĂ܂B
KernelNAloginł悤ɂȂ
_łAÄ͂قƂǂȂȂ
ĂƎv܂B32MBx̃ł́A
Ƃ1MB̗̈悳AÄm
͓̂ł傤B
  ƂAxOŜׂĂ
vZX~߂āASWAP̈֒ǂov
ZX݂ȒǂoāA̒g\[
gċl߂邱Ƃł傤B
  ̍Ƃ̊OS͌ł܂邵܂񂵁A
ۂɎ邱ƂlƌIȈĂł
ȂłB

  ȂƁAPS2 LinuxDMA̎
lꂽłĂ܂B

  PS2 Linux͂܂ŁAPS2ւLinux̎
łȀX삵ėlXȃAv
P[V삵܂B32MB̃͌
đ킯ł͂܂񂩂A悭g
Ȃ΂Ȃ܂B
  ̑O𖞂łSCEɂ͎
ɂ΂炵̂łB
  Aps2_dma_start()ł̓^O̐ɔ
ႵCPU𖳑ʂɐL܂ADMÃ^O
`F[΁ÅԂ͌ł܂܂BDMA
̃^O͎ہApIɎgƂȂƂ΂ɂ
Ȃ\ȗʂɂȂ܂B
  ̂܂܂ł͂DMAA[LeN`
Ă܂B

 Kernelpɉ


  ȏ̂悤ȎɍlꂽPS2 Linux
DMAłAOςΘb͈Ⴂ
܂B
  ̂͒PɃOtBbNŗVԎ
łAX͕Kv܂񂵁Ȁ
삷AvP[V̂ƂlKv
܂BR\[A邢̓lbg
[ÑOCłgccΏ\
łB
  Ȃ΁A32MB͕KvȂł
A16MBł\Ǝv܂BāA
]16MBDMApɂ΁A͉
܂B
  Ap̃J[l쐬A
̂߂̕j肵܂B

1. NDMAp̃Ԃ\񂵂Ă
   ALinux͎g܂B

2. /dev/ps2memmmap()͗\񂵂
   ɑ΂čs܂B

3. ioctl()gāAɕKvTTE=1
   Source Chain ModeDMAǉ܂B

  DMAref^OŎw肷AhX́A
zAhXł͂ȂAAhXw肵
Ă͂Ȃ܂B
  ǍvZŃ\񂵂Ă
܂ĂȏAɊȒPŁAP
/dev/ps2memmmap()̈̃ItZ
bg\JnAhXɉ邾łB

  łɁAI/Oڐ䂵Ȃ鎖͔
Ă܂̂ŁAǉ܂B

4. 0x10000000-0x20000000R
   ANZXłfoCX/dev/ps2geniop
   ӂ܂B

5. DMAOŔs鎞̂ƂlāA
   /dev/ps2genioioctl()Ńf[^LbV
   tbVł悤ɂB

  ȏœ̖ړI͒Bł܂B
  ɂ@\낢ƕKvɂȂ邩
܂񂪁A͂܂~Ȃɒǉ
΂̂łBpłB

  ۂɃpb`쐬ōsƂ͈ȉ̒ʂ
łB

1.  Ñ̈\񂵂܂B
    ́A\[Xc[
      $(LINUXSRC)/arch/mips/mm/init.c
    ύX܂B
    i386̃R[hɂ́AÑeʕ\
    reservedȗ̈TCY̕\
    łAmips̃R[hɂ͂Ȃ̂ŁA
    łɂ܂B
    {Ȃ΁AU[ueʂ̐ݒ̓J[l
    IvVɒǉ@Y
    ŗǂƎv܂AɃRp
    C΂̂ƂȂ̂ŁA
      $(LINUXSRC)/include/linux/ps2/dev.h
    ɒl`邾ɂ܂B

2.  /dev/ps2mem̏ύX܂B
    IWî̂ł́AKvɉ
    Kernel烁擾Ċ蓖ĂĂ
    ̂łA͗\񂵂y[W
    ܂remap悤ɂ܂B
    DMÂ߂file\тprivate_data
    ͕AhXvZĐݒ肷邱Ƃ
    YĂ͂܂B
    ȏŁA/dev/ps2mem͕ԏɘA
    mۂ܂B

3.  Source ChainTTE=1łDMA]̂
    ߂ioctl()g܂B
    efoCXR[h́A
      $(LINUXSRC)/drivers/video/ps2dev.c
    ɂ܂B
    DMAioctl()̏͊efoCX狤
    āÃ\[Xt@C
	ps2dev_send_ioctl()
    Ă܂̂ŁAɒǉ܂B
    PS2IOC_SEND, PS2IOC_SENDAɌKāA
    V`́APS2IOC_SEND_TTE1, 
    PS2IOC_SENDA_TTE1Ƃ܂B
    ̒`
      $(LINUXSRC)/include/linux/ps2/dev.h
    ɒǉ܂B

4.  ۂioctl()ŌĂяoꂽDMA]
    R[h́A
      $(LINUXSRC)/drivers/video/ps2dma.c
    ɂ܂̂ŁAύX܂B
    Source ChainTTE=1ƂDMA]𔭍s
    ֐ꍞ݂܂B
    PS2IOC_SEND(A)̎̃[`܂
    pĒ킹AKvȂƂ͎
    tO铙āAƂ̃[`
    ƂԂȂ悤ɍ݂DMA]
    sł悤Ɏ܂B

5.  I/O𒼐ڐł悤ɐVfoC
@@X쐬܂BO͏
    /dev/ps2genioƖt܂AhCo
    ̃\[Xł͎gpĂȂminorԍ
    ǉāA/dev/ps2mem̂悤ɍs
    remapxI/O0x10000000-
    0x20000000ɑ΂čs܂B
    ($(LINUXSRC)/drivers/video/ps2dev.c
    $(LINUXSRC)/drivers/video/ps2mem.c)

6.  /dev/ps2genioioctl()ǉ
    ߂ɁA
      $(LINUXSRC)/drivers/video/ps2mem.c
    ύX܂BɁA
      $(LINUXSRC)/include/linux/ps2/dev.h
    ɐVAioctl()A
	PS2IOC_FLUSH_CACHE_ALL
    
	PS2IOC_DMA_CACHE_WBACK_INV
    ǉAꂼACACHȆŚ͈Aw
    ͈͂邱Ƃɂ܂BPS2IO
    C_DMA_CACHE_WBACK_INV͊JnԒnƒ
    ̓̈KvȂ̂ŁA\̂œn
    ܂B

7.  Ȃłɍpb`ł
    AIWĩJ[lƂ̎ʕ@
    pӂȂĂ͂܂B
    ioctl()Ŗ`̃R[hw肷
    EINVALԂ܂As̃`FbN
    ͉\łBRpC̃`FbN̂
    ߂ɁA
      $(LINUXSRC)/include/linux/ps2/dev.h
    Version`ǉĂ܂B

ȏŊƑ܂Aۂɂ͂܂
YɎ^Ԃ킯͂ȂAx̎s
낪KvłB

ȏ̂悤ɂĊpb`͏̃J[
lƂ͌݊ۂĂ܂̂ŁATv
blowsł܂B
(blow̓U[üƂ16MBĂ
ƁAʂł̓XbvĂ܂܂)

 g


  ps2linux-patch-0.2-20010909.gzȉ̂
ɂĂ܂B

  cd /usr/src/linux
  gzip -dc ps2linux-patch-0.2-20010909.gz
	| patch -p1

  ͕ʂɃJ[lRpCĐV
J[lōċN܂BJ[l
ConfigurationƂāA

  $(LINUXSRC)/config_ps2

̂܂܎gpĂ܂B
  ۂ̍ƂɓẮABoot menuǉ
ďJ[lcĒuȂƌ
ƂɂȂ肻łB
  Ƀu[głArootɂȂāAI/O
}bsO邽߂/dev/ps2geniofoC
X쐬܂B

  mknod /dev/ps2genio c 240 96

ȏŃZbgAbv͏IłB

  głAlibps2devłGSɑ΂
Source Chain]A

  ps2_dma_start( fdgs, NULL, datapointer );

̂悤ɋLqĂ܂Ȃւ

  struct ps2_packet dma_gs;
  dma_gs.ptr   = datapointer;
  dma_gs.len   = 16;
  ioctl( fdgs, PS2IOC_SEND_TTE1, &dma_gs );

ƋLqł悤ɂȂ܂B
  AVPU1ւ͎̂悤ɂăf[^]
ł܂B

  struct ps2_packet dma_vpu1;
  dma_vpu1.ptr   = datapointer;
  dma_vpu1.len   = 16;
  ioctl( ps2_vpu_fd(vpu1),
        PS2IOC_SEND_TTE1, &dma_vpu1 );

  len̓f[^Ɋ֌WȂ16Ƃ܂B
  ́A
    $(LINUXSRC)/drivers/video/ps2dma.c
DMAɊgʂłBlen̒l
͎̂̂gp܂񂪁AleñG[`F
bN͂̂܂܂Ȃ̂ŁA16̔{^Ȃ
G[ɂȂ܂B
  DMA]f[^tagŋLq郁Ah
X͑SAhXłȂ΂Ȃ܂B
  zAhX畨AhXւ̕ϊ@
ƂẮA/dev/ps2memmmap()̃Ah
XoĂAZăItZbg
߂A{pb`̓Kp
  /usr/include/linux/ps2/dev.h
Œ`PS2_RESERVE_MEMORY_STARTZ
邱Ƃ߂܂B

  gp̒ӓ_܂Ƃ߂ƁAȉ̂悤
Ȃ܂B

E/dev/ps2memmmap()̈͋Nɗ\
  񂵂܂B{pb`KṕA/dev/ps2mem
  ͗\̈悩炵擾łȂ
  łALinux͗\̈gp邱
  ͂ł܂B
  \̈̃ftHg16MBłApr
  ĕύX悢Ǝv܂B
  ہA_eNX`DMA]
@ꍇɂ̗͂̈ɒuȂ΂ȂȂ
@ƂɒӂĂB 
  (/usr/src/linux/include/linux/ps2/dev.h
  PS2_RESERVE_MEMORY_START
  PS2_RESERVE_MEMORY_SIZE)

E/dev/ps2memmmap()鎞ɂoffsetg
  Ă͂Ȃ܂B

E/dev/ps2geniooffsetw肵Ă悢
  ły[WPʂłKv܂B
  ׂĂI/OGA0x10000000-0x20000000
  }bv邱Ƃ͂ł܂񂪁AEE֘A
  0x10000000-0x14000000xȂΈxɃ}
  bv邱Ƃł܂B
  (ʏ͕KvȂ͂łAǂĂ
@ɃANZX́Aoffsetg
  mmap()Ă)

EL2offset̐́AXC邱
@ƂŊɘał܂Â݂Ƃ낻̕Kv
@Ƃ͂܂B

 DMAOŃLbN


  /dev/genioǉ̂łA
DMAŃLbNĂ݂܂B
  ܂ƂāAvȌɂ
vO1̂悤/dev/ps2genio/dev/ps2mem
mmap()Ă܂B
  ۂDMA]sOɁACPŨf[^L
bṼf[^ɏoĂK
v̂ŁA/dev/ps2genioɑ΂
ioctl()𔭍s܂B̌AI/O|[gɑ
Ăփf[^݁ADMA]X^[g
܂BۂɃR[fBO
́AvO2̂悤ɂȂ܂B(VPU1,GS
ɑ΂DMA𔭍sĂ܂)
  A{iKɎgp邽߂ɂ́Â
DMAs̓J[l̊֒mƂł
܂̂ŁAJ[lDMAs(
libps2devÖقŔŝ܂݂܂)
͖NȂ悤ɒȂ
Kv܂B
  ƂŁADMA]X^[ĝŁA
ɓ]I҂Ă݂܂傤B́AP
DMACHCR̃rbg܂܂ǂm
F邾ŗǂ̂łALinux̂悤ȃ}
`^XNIy[eBOVXeł̓[
vő҂͖̂肪܂B
  {Ȃ΁AxXbhX[vāA
DMAI̊荞݂ŃXbhEFCNAb
vKv̂łA͘bȒP
ɂ邽߂ɁAusleep()ŏ҂Ȃ烋[
v܂Bۂ̃vOR[h́A
vO3̂悤ɂȂ܂B

 vO


  t^CDɂ́ATvvO4p
ӂĂ܂B

Edmamemtest-20010722.tgz

  /dev/ps2mem̃eXgƎgp@̃Tv
łBxmmap()ă̓eύX
Axmmap()ȂāAe
mmap()邱ƂmF܂B
  IWiPS2 LinuxƂ͓삪قȂA
xs2ڂ͓A
NZX邱Ƃ킩܂B

Egeniotest-20010722.tgz

  /dev/ps2geniõeXgƎgp@̃Tv
łBI/O|[g̓ǂݍ݂Ə݂s
܂B{vOsƁAReturn
тɁA4̃^C}T0,T1,T2,T3̒l\
AwiF_ɕω܂B

Ecube200-20010909.tgz

  200CUBE̕\s܂Bpbh
KɃJ𑀍삷邱ƂłASELECT{
^ŉZ\ł܂BPS2炵Ƃ
Ă܂񂵁APS2̐\𔭊
ł܂B̃pb`p̃fƂ
̈Ӗ͂܂B

Ecube200dma-20010909.tgz

  cube200dmasioctl()g킸ɒ
I/O|[gLbN悤ɕύX̂
B

 Ō


  PS2LinuxAɖʔgݍ킹łA
͂̓͍œKȑgݍ킹Ƃ킯
͂ȂƎ͎vĂ܂B
  {eł̓܂AQ[̐
Eɂďdvȗvf̈ł郊A^C
ɂĂAfLinuxł͐Ǝȕ
ł傤B
  î܂܂PS2 LinuxŊyނ̂
ł傤A\tgEGÃ\[X͌J
Ă̂łA҂̓҂荇
悤Linuxy݂ł傤B
  {ɁASCE͎ɖʔi𔭔Ă
ꂽƎv܂B


1.
  2DMA݂͌ɂ܂₳ē]
܂APS2̌̂悢sƂȂƘb͕
ŁAʁX̃pXœGS`悳̂͂
܂悭܂BGS͗҂sĕ`
Ǝ͂𔭊łȂ̂łB
  炪vO}̘řǂŁA
͓KޓKŎg邱ƂɂȂ܂
A܂1t[ɂĎg邱
ł傤B
  ]kɂȂ܂APS2̃`[jOɂ
čłǂ삳Kv̂GS
łB
  ǂȂɌ̂悢vOƂ
ĂGSɂʕ`摬xȏɑȂ邱
͂܂񂩂B

2.
  }1̒ʂoX͋ʂłB

3.
  PCV-RAM̃C[WƂ͈قȂAPS23D
OtBbNVXeł̓fBXvC̃t
bVɂׂĂɉʂ`悵Ȃ܂B
  ʁAtbV[g60Hzł̂ŁA
1ʂ̕`1/60bȓɏI点Ȃ
Ȃ܂B

4.
  ̂ƂA1DMA]݂̂łׂĕ`
Ƃ͌܂B1x`悵f[^EE
ŉHāAėpꍇ܂B
  ̎ɂ́ADMA]ɂ`悪I
_Ŋ荞݂āAEEV-RAM]
ďsAGS֓]DMA]
`n߂܂B
  xłsƂł܂AACfB
Ał낢ȂƂł܂B
  ̓vO}̐El悾ƌ܂B

ȏ

