֤ϡIO ޥåԥ󥰤ᤰؤβ᡼Ǥ롣Τźդ
  ʸȤƤϥեޥåȤѤˤʤäƤ롣

AHA-1542 ϥХޥưǥХǤ롣ƤʤΥѥåϡ
ȥ˥Хåեʪɥ쥹Ϳ褦˥ɥ饤Сѹ
 x86 ˤƤȸ (ʤʤ餹٤ƤΥХޥ
ǥХʪ꡼Υޥåԥ󥰤ľܸ뤫)

֤ʤ顢ޤޤʹΥƥˤϥꥢɥ쥹
Ȥ뤿ˡ¤ΤȤ *3 * ۤʤˡ¸ߤƤ
¿ƼºݤˡΤ褦ʥǤ 3 ܤˡ
֥Хɥ쥹פȸƤФˡȤ٤ʤ

§Ȥơ3 ĤΥɥ쥹ˡǤΥɽϰʲΤ褦ˤʤ롣
(ϡּ¥סʤ̾ RAM ؤƤ롣ܺ٤ϺǸ򸫤ߤ)

 - CPU ѴƤʤϡʪץɥ쥹ʪɥ쥹 0 ֤ϡ
   CPU ΥХ(ϩ)˥ 0 ϤȤˡCPU Ȥ
   ɥ쥹

 - CPU Ѵɥ쥹ϡֲۡץɥ쥹Ǥ롣ơ
   CPU Υɥ쥹ǤꡢCPU ŬڤѴܤơCPU ѴƤʤ
   ɥ쥹ؤбŤ򤪤ʤ

  - Хɥ쥹 CPU ǤϤʤ*¾*ǥХ鸫Υ
    ɥ쥹Ǥ롣ߡƥǥХ줾ˡˤäƥ
    뤳Ȥǡ¿ΰۤʤäХɥ쥹롣
	ɬפʤ¤虜虜Ȥߤʣˤ褦Ȥ
    褦ʥϡɥѼԤϤޤʤΤǡ٤Ƥγϡɥ
    ϡ꡼ƱˡǻȤƤȻפäƤ褤

ơ̾ PC ΥХɥ쥹ϡ̩ʪɥ쥹ơ
˻ñǤ롣ʤ顢ñ㤵ȤΤϥ꡼ȥ
Хʤɥ쥹֤ͭƤ뤫ޤƤΤǡ줬
Ū¾ PCI/ISA åȥåפξǤɬ⿿ǤȤϤʤ

Ǥϼ򼨤ץå׵(PReP:PowerPC Reference Platform)ξ硢
CPU ϥޥåפʲΤ褦˻Ȥ롣(ϥ꤫鸫):

	0-2 GB		"¥"
	2 GB-3 GB	"ƥ IO" (inb/out Ʊͤ x86 Υ򤪤ʤ)
	3 GB-4 GB 	"IO "  (IO Х𤷤ͭ)

ơȤƤñȻפäʤƱȤǥХ¦
ͤˤϵդΤȤˤʤ롣ʪΥɥ쥹 0 ϡºݤˤ
ɤ IO ޥˤȤäƤ⡢2GB ʾΥɥ쥹̣ƤΤ

ǡCPU Ϥɤ줫ХޥΥǥХʪ 0 ֤˽񤤤Ƥ
餪Ȼפäϥꥢɥ쥹 0x80000000 ͿʤФ
ʤʤäƤޤ

   櫓 PPC ФƼºݤ˥ͥΥޥåԥ󥰼ǰۤʤ
ϤΤΡȤФʴ夯

 ʪɥ쥹:	0
 ۥɥ쥹:	0xC0000000
 Хɥ쥹:	0x80000000

Τ٤ƤΥɥ쥹ƱȤɽƤ롣ñ˰㤦Ѵ̤
ƱΤ򸫤ƤʤΤ

Ʊ褦ˡAlpha Ǥϡ̾Ѵ

 ʪɥ쥹:	0
 ۥɥ쥹:	0xfffffc0000000000
 Хɥ쥹:	0x40000000

Ǥ롣

( Alpha Ǥ⡢Τˤꡢʪɥ쥹ȥХɥ쥹Ʊ
Τ򼨤Ƥ褦ʤΤ⤢)

ˤ衢ƤѴ򸫤ĤˤϡΤ褦ˤФ褤

	#include <asm/io.h>

	phys_addr = virt_to_phys(virt_addr);
	virt_addr = phys_to_virt(phys_addr);
	 bus_addr = virt_to_bus(virt_addr);
	virt_addr = bus_to_virt(bus_addr);

Ǥϡġ줬ɬפˤʤ뤫?

ºݤ˥ͥ뤫ݥ󥿤ǥ褦Ȥˤϡʤ
**ɥ쥹ߤʤ롣ǡʲΤ褦ˤФ

	/*
	 * ϡȥ̿뤿Υϡɥ "mailbox"
	 * ȥϡľܤΰ򸫤뤳ȤǤ롣
	 */
	struct mailbox {
		__u32 status;
		__u32 bufstart;
		__u32 buflen;
		..
	} mbox;

		unsigned char * retbuffer;

		/* ȥ餫饢ɥ쥹롣*/
		retbuffer = bus_to_virt(mbox.bufstart);
		switch (retbuffer[0]) {
			case STATUS_OK:
				...

ΰȥ顼˥ХåեΥɥ쥹ͿˤϡХ
ɥ쥹ߤʤ롣Ĥޤꡢ

	/* ȥ˸о֤"sense_buffer"ˤ褦ꤹ */
	mbox.bufstart = virt_to_bus(&sense_buffer);
	mbox.buflen = sizeof(sense_buffer);
	mbox.status = 0;
	notify_controller(&mbox);

ˤʤ롣

ơ̤ˤʪɥ쥹Ȥʤ뤳Ȥ**ʤʤʤ顢
CPU ̤ơȤȤԲǽ(CPU Ѵ줿ۥ
쥹𤷤ƤΤѲǽ)ƥХޥǥХ餽Ĥ
ȤǤʤ

ǤϤʤϤˤ⤫餺ʪɥ쥹ռʤȤ
ʤΤ̾ΥɤǤϤۤɽФƤΤǤʤʪɥ쥹
ɬפʥΤˤΤȤХޥåԥ󥰤Ѥݤ
ʪɥ쥹ɬפȤ롣ȤС"remap_page_range()" Ȥ
ؿϡʪɥ쥹̤Υɥ쥹إޥåפʤ
(ؤϡCPU γˤǥХˤĤΤʤΤᡢ֥
ɥ쥹פ䤽δϢˤĤΤʤƤ褤Ϥ)

!! 嵭εҤϡΤΰǤʤ嵭ñ"¥
" Ĥޤ CPU (RAM)ˤĤƸڤƤǤ롣

Ȥϴ˰ۤʤμब롣 PCI  ISA Хˤ
ֶͭפϰ̤ RAM ǤϤʤơͥåȥɤʤ
ˤѥåȥХåեΤ褦ʤΤǤꤨ롣(ȤϤӥǥ
եåɤξˤϡե졼ХåեȤƻȤ̤
DRAM Ǥ뤱ɤ)

ΥϡPCI פȤֶͭפȤIO פȤ
뤤Ϥष̾ΤǸƤФ롣˥ˡϰĤ
ʤĤޤꡢreadb/writeb ȤδϢδؿǤ롣ʤϡڤ
ΥΥɥ쥹갷ɬפϤʤʤʤˤΤ褦ʥ
쥹ФƤǤ뤳ȤϲʤɤȤȤȡּ
פȳǰ太ʤ֤Ȥ櫓ǤʤäƤ
ؤݥ󥿤ջȤ뤳ȤǤϤʤ(ʤȤ x86 
ƥ㡼ˤƤϡƱ֤ؤƤ롣Ĥޤ x86
Ǥϥݥ󥿤εդ˻ȤߤƯ뤳ȤǤ롣ϸߴ
̤ɤʤ)

Τ褦ʥˤϡʲΤ褦нǤ롣

 - ɤ߹:
	/*
	 * ǽ 32bit  0xC0000 ˤ ISA ꤫ɤ߹ࡣ
	 * ϡDOS ǤȤΡC000:0000 ̣롣
	 */
	unsigned int signature = readl(0xC0000);

 - remap Ƚ񤭹:
	/*
	 * 0xFC000000 ˤ 1MB ΥΥե졼Хåե PCI ΰ
	 * remap 롣ˤꡢΰ˥뤳ȤǤ롣
	 * ľܥǤΤϡ640KB-1MB ΰʤΤǡʳ
	 * remap ʤȤʤ
	 */
	char * baseptr = ioremap(0xFC000000, 1024*1024);


	/* 'A' ΰΥեå 10 ˽񤭹 */
	writeb('A',baseptr+10);

	/* ɥ饤Ф unload Ȥ˥ޥåפ */
	iounmap(baseptr);

 - ԡӾõ:
	/* get the 6-byte Ethernet address at ISA address E000:0040 */
	memcpy_fromio(kernel_buffer, 0xE0040, 6);
	/* write a packet to the driver */
	memcpy_toio(0xE1000, skb->data, skb->len);
	/* clear the frame buffer */
	memset_io(0xA0000, 0, 0x10000);


OKǥݡ֥ IO 򥢥뤿δܤ򲡤?
Ȥ? ʤϡ嵭Ǥ⤦ʬ뤯餤ʣȻפä
ʤϼʬܤ 500MHz  Alpha ޥ󤬤ơɥ
СڤळȤˤʤ뤫⤷ʤ ;-)


աͥС 2.0.x (Ȥ)ϡְ㤨 ioremap() ؿ
vremap() ȸƤǤioremap() ̾Ǥ뤬ǽ˥ꥸʥ
䤬񤤤ˤϡȹͤʤäξ򥵥ݡȤʤȤ
ʤͤϡʲΤ褦

	/* ŤФ̿̾򥵥ݡȤ */
	#if LINUX_VERSION_CODE < 0x020100
	#define ioremap vremap
	#define iounmap vfree
	#endif

եƬˡΤ褦ʥɤ򤪤ơ2.0.x ƥˤƤ
̾Ĥ褦ˤǤ롣

ơεҤϤμºݤⰭʹ롣¿Υꥢɥ饤С
ˤʣʤȤ򤹤٤ƹԤʤäƤ餺(뤤Ϥष
顼䥿ॢȽʤɤˤƤۤɤˤϡۤɼºݤ IO 
ˤƤʣǤϤʤΤǤ롣)̤ˡɥ饤СΤ
ѤʤȤǤϤʤ¿ξ硢ɤϸºݤɤ
롣

	unsigned long signature = *(unsigned int *) 0xC0000;

		

	unsigned long signature = readl(0xC0000);


LinuxΥС2 ϼºݡ򤷤䤹ʤäȤ⤦ɡ?

		Linus

[:  miura@blue.gr.jp]
