diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2017-01-29 22:00:47 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2017-01-29 22:00:47 +0000 |
commit | 65575c14243781e76649ccc733536a1c27ac150a (patch) | |
tree | 27b13d22cb49384638d79ceaed61caef7c5d46c1 /sys | |
parent | 98221d2e7e1f09324f51bebdb8fee38d8fa56337 (diff) | |
parent | a0f64f38a1829b7c26bf801b96d7cff65d3c4c24 (diff) | |
download | src-65575c14243781e76649ccc733536a1c27ac150a.tar.gz src-65575c14243781e76649ccc733536a1c27ac150a.zip |
Merge ^/head r312894 through r312967.
Notes
Notes:
svn path=/projects/clang400-import/; revision=312968
Diffstat (limited to 'sys')
366 files changed, 1239 insertions, 42674 deletions
diff --git a/sys/Makefile b/sys/Makefile index fa8941ef3378..7d88c4ecdf22 100644 --- a/sys/Makefile +++ b/sys/Makefile @@ -8,7 +8,7 @@ CSCOPEDIRS= boot bsm cam cddl compat conf contrib crypto ddb dev fs gdb \ rpc security sys ufs vm xdr xen ${CSCOPE_ARCHDIR} .if !defined(CSCOPE_ARCHDIR) .if defined(ALL_ARCH) -CSCOPE_ARCHDIR = amd64 arm arm64 i386 mips pc98 powerpc riscv sparc64 x86 +CSCOPE_ARCHDIR = amd64 arm arm64 i386 mips powerpc riscv sparc64 x86 .else CSCOPE_ARCHDIR = ${MACHINE} .if ${MACHINE} != ${MACHINE_CPUARCH} diff --git a/sys/amd64/amd64/pmap.c b/sys/amd64/amd64/pmap.c index 5d09929bd84b..1a6fb1a5de3e 100644 --- a/sys/amd64/amd64/pmap.c +++ b/sys/amd64/amd64/pmap.c @@ -1040,7 +1040,12 @@ pmap_bootstrap(vm_paddr_t *firstaddr) virtual_avail = va; - /* Initialize the PAT MSR. */ + /* + * Initialize the PAT MSR. + * pmap_init_pat() clears and sets CR4_PGE, which, as a + * side-effect, invalidates stale PG_G TLB entries that might + * have been created in our pre-boot environment. + */ pmap_init_pat(); /* Initialize TLB Context Id. */ @@ -3428,6 +3433,7 @@ pmap_demote_pde_locked(pmap_t pmap, pd_entry_t *pde, vm_offset_t va, vm_paddr_t mptepa; vm_page_t mpte; struct spglist free; + vm_offset_t sva; int PG_PTE_CACHE; PG_G = pmap_global_bit(pmap); @@ -3464,9 +3470,9 @@ pmap_demote_pde_locked(pmap_t pmap, pd_entry_t *pde, vm_offset_t va, DMAP_MAX_ADDRESS ? VM_ALLOC_INTERRUPT : VM_ALLOC_NORMAL) | VM_ALLOC_NOOBJ | VM_ALLOC_WIRED)) == NULL) { SLIST_INIT(&free); - pmap_remove_pde(pmap, pde, trunc_2mpage(va), &free, - lockp); - pmap_invalidate_page(pmap, trunc_2mpage(va)); + sva = trunc_2mpage(va); + pmap_remove_pde(pmap, pde, sva, &free, lockp); + pmap_invalidate_range(pmap, sva, sva + NBPDR - 1); pmap_free_zero_pages(&free); CTR2(KTR_PMAP, "pmap_demote_pde: failure for va %#lx" " in pmap %p", va, pmap); @@ -3608,11 +3614,23 @@ pmap_remove_pde(pmap_t pmap, pd_entry_t *pdq, vm_offset_t sva, pmap->pm_stats.wired_count -= NBPDR / PAGE_SIZE; /* - * Machines that don't support invlpg, also don't support - * PG_G. + * When workaround_erratum383 is false, a promotion to a 2M + * page mapping does not invalidate the 512 4K page mappings + * from the TLB. Consequently, at this point, the TLB may + * hold both 4K and 2M page mappings. Therefore, the entire + * range of addresses must be invalidated here. In contrast, + * when workaround_erratum383 is true, a promotion does + * invalidate the 512 4K page mappings, and so a single INVLPG + * suffices to invalidate the 2M page mapping. */ - if (oldpde & PG_G) - pmap_invalidate_page(kernel_pmap, sva); + if ((oldpde & PG_G) != 0) { + if (workaround_erratum383) + pmap_invalidate_page(kernel_pmap, sva); + else + pmap_invalidate_range(kernel_pmap, sva, + sva + NBPDR - 1); + } + pmap_resident_count_dec(pmap, NBPDR / PAGE_SIZE); if (oldpde & PG_MANAGED) { CHANGE_PV_LIST_LOCK_TO_PHYS(lockp, oldpde & PG_PS_FRAME); @@ -3994,9 +4012,14 @@ retry: if (newpde != oldpde) { if (!atomic_cmpset_long(pde, oldpde, newpde)) goto retry; - if (oldpde & PG_G) - pmap_invalidate_page(pmap, sva); - else + if (oldpde & PG_G) { + /* See pmap_remove_pde() for explanation. */ + if (workaround_erratum383) + pmap_invalidate_page(kernel_pmap, sva); + else + pmap_invalidate_range(kernel_pmap, sva, + sva + NBPDR - 1); + } else anychanged = TRUE; } return (anychanged); diff --git a/sys/arm/include/atomic-v4.h b/sys/arm/include/atomic-v4.h index b4ff5bf15a5e..80f3f94e0e44 100644 --- a/sys/arm/include/atomic-v4.h +++ b/sys/arm/include/atomic-v4.h @@ -112,6 +112,43 @@ atomic_clear_64(volatile uint64_t *address, uint64_t clearmask) __with_interrupts_disabled(*address &= ~clearmask); } +static __inline int +atomic_fcmpset_32(volatile u_int32_t *p, volatile u_int32_t *cmpval, volatile u_int32_t newval) +{ + u_int32_t ret; + + __with_interrupts_disabled( + { + ret = *p; + if (*p == *cmpval) { + *p = newval; + ret = 1; + } else { + *cmpval = *p; + ret = 0; + } + }); + return (ret); +} + +static __inline int +atomic_fcmpset_64(volatile u_int64_t *p, volatile u_int64_t *cmpval, volatile u_int64_t newval) +{ + u_int64_t ret; + + __with_interrupts_disabled( + { + if (*p == *cmpval) { + *p = newval; + ret = 1; + } else { + *cmpval = *p; + ret = 0; + } + }); + return (ret); +} + static __inline u_int32_t atomic_cmpset_32(volatile u_int32_t *p, volatile u_int32_t cmpval, volatile u_int32_t newval) { @@ -370,6 +407,12 @@ atomic_swap_32(volatile u_int32_t *p, u_int32_t v) return (__swp(v, p)); } +#define atomic_fcmpset_rel_32 atomic_fcmpset_32 +#define atomic_fcmpset_acq_32 atomic_fcmpset_32 +#define atomic_fcmpset_rel_64 atomic_fcmpset_64 +#define atomic_fcmpset_acq_64 atomic_fcmpset_64 +#define atomic_fcmpset_acq_long atomic_fcmpset_long +#define atomic_fcmpset_rel_long atomic_fcmpset_long #define atomic_cmpset_rel_32 atomic_cmpset_32 #define atomic_cmpset_acq_32 atomic_cmpset_32 #define atomic_cmpset_rel_64 atomic_cmpset_64 @@ -421,6 +464,14 @@ atomic_cmpset_long(volatile u_long *dst, u_long old, u_long newe) } static __inline u_long +atomic_fcmpset_long(volatile u_long *dst, u_long *old, u_long newe) +{ + + return (atomic_fcmpset_32((volatile uint32_t *)dst, + (uint32_t *)old, newe)); +} + +static __inline u_long atomic_fetchadd_long(volatile u_long *p, u_long v) { diff --git a/sys/arm/include/atomic-v6.h b/sys/arm/include/atomic-v6.h index 507a1d08191b..2a579dbd0a67 100644 --- a/sys/arm/include/atomic-v6.h +++ b/sys/arm/include/atomic-v6.h @@ -190,6 +190,114 @@ ATOMIC_ACQ_REL(clear, 32) ATOMIC_ACQ_REL(clear, 64) ATOMIC_ACQ_REL_LONG(clear) +static __inline int +atomic_fcmpset_32(volatile uint32_t *p, uint32_t *cmpval, uint32_t newval) +{ + uint32_t tmp; + uint32_t _cmpval = *cmpval; + int ret; + + __asm __volatile( + " mov %0, #1 \n" + " ldrex %1, [%2] \n" + " cmp %1, %3 \n" + " it eq \n" + " strexeq %0, %4, [%2] \n" + : "=&r" (ret), "=&r" (tmp), "+r" (p), "+r" (_cmpval), "+r" (newval) + : : "cc", "memory"); + *cmpval = tmp; + return (!ret); +} + +static __inline uint64_t +atomic_fcmpset_64(volatile uint64_t *p, uint64_t *cmpval, uint64_t newval) +{ + uint64_t tmp; + uint64_t _cmpval = *cmpval; + int ret; + + __asm __volatile( + "1: mov %[ret], #1 \n" + " ldrexd %Q[tmp], %R[tmp], [%[ptr]] \n" + " teq %Q[tmp], %Q[_cmpval] \n" + " ite eq \n" + " teqeq %R[tmp], %R[_cmpval] \n" + " bne 2f \n" + " strexd %[ret], %Q[newval], %R[newval], [%[ptr]]\n" + "2: \n" + : [ret] "=&r" (ret), + [tmp] "=&r" (tmp) + : [ptr] "r" (p), + [_cmpval] "r" (_cmpval), + [newval] "r" (newval) + : "cc", "memory"); + *cmpval = tmp; + return (!ret); +} + +static __inline u_long +atomic_fcmpset_long(volatile u_long *p, u_long *cmpval, u_long newval) +{ + + return (atomic_fcmpset_32((volatile uint32_t *)p, + (uint32_t *)cmpval, newval)); +} + +static __inline uint64_t +atomic_fcmpset_acq_64(volatile uint64_t *p, uint64_t *cmpval, uint64_t newval) +{ + uint64_t ret; + + ret = atomic_fcmpset_64(p, cmpval, newval); + dmb(); + return (ret); +} + +static __inline u_long +atomic_fcmpset_acq_long(volatile u_long *p, u_long *cmpval, u_long newval) +{ + u_long ret; + + ret = atomic_fcmpset_long(p, cmpval, newval); + dmb(); + return (ret); +} + +static __inline uint32_t +atomic_fcmpset_acq_32(volatile uint32_t *p, uint32_t *cmpval, uint32_t newval) +{ + + uint32_t ret; + + ret = atomic_fcmpset_32(p, cmpval, newval); + dmb(); + return (ret); +} + +static __inline uint32_t +atomic_fcmpset_rel_32(volatile uint32_t *p, uint32_t *cmpval, uint32_t newval) +{ + + dmb(); + return (atomic_fcmpset_32(p, cmpval, newval)); +} + +static __inline uint64_t +atomic_fcmpset_rel_64(volatile uint64_t *p, uint64_t *cmpval, uint64_t newval) +{ + + dmb(); + return (atomic_fcmpset_64(p, cmpval, newval)); +} + +static __inline u_long +atomic_fcmpset_rel_long(volatile u_long *p, u_long *cmpval, u_long newval) +{ + + dmb(); + return (atomic_fcmpset_long(p, cmpval, newval)); +} + static __inline uint32_t atomic_cmpset_32(volatile uint32_t *p, uint32_t cmpval, uint32_t newval) { diff --git a/sys/arm/include/atomic.h b/sys/arm/include/atomic.h index e31be000458c..4c404dc4bf74 100644 --- a/sys/arm/include/atomic.h +++ b/sys/arm/include/atomic.h @@ -84,6 +84,9 @@ atomic_store_long(volatile u_long *dst, u_long src) #define atomic_set_ptr atomic_set_32 #define atomic_set_acq_ptr atomic_set_acq_32 #define atomic_set_rel_ptr atomic_set_rel_32 +#define atomic_fcmpset_ptr atomic_fcmpset_32 +#define atomic_fcmpset_rel_ptr atomic_fcmpset_rel_32 +#define atomic_fcmpset_acq_ptr atomic_fcmpset_acq_32 #define atomic_cmpset_ptr atomic_cmpset_32 #define atomic_cmpset_acq_ptr atomic_cmpset_acq_32 #define atomic_cmpset_rel_ptr atomic_cmpset_rel_32 @@ -105,6 +108,9 @@ atomic_store_long(volatile u_long *dst, u_long src) #define atomic_set_int atomic_set_32 #define atomic_set_acq_int atomic_set_acq_32 #define atomic_set_rel_int atomic_set_rel_32 +#define atomic_fcmpset_int atomic_fcmpset_32 +#define atomic_fcmpset_acq_int atomic_fcmpset_acq_32 +#define atomic_fcmpset_rel_int atomic_fcmpset_rel_32 #define atomic_cmpset_int atomic_cmpset_32 #define atomic_cmpset_acq_int atomic_cmpset_acq_32 #define atomic_cmpset_rel_int atomic_cmpset_rel_32 diff --git a/sys/arm64/include/atomic.h b/sys/arm64/include/atomic.h index 41ad6ccffee4..9318de1c3bda 100644 --- a/sys/arm64/include/atomic.h +++ b/sys/arm64/include/atomic.h @@ -98,6 +98,61 @@ ATOMIC(clear, bic) ATOMIC(set, orr) ATOMIC(subtract, sub) +#define ATOMIC_FCMPSET(bar, a, l) \ +static __inline int \ +atomic_fcmpset_##bar##32(volatile uint32_t *p, uint32_t *cmpval, \ + uint32_t newval) \ +{ \ + uint32_t tmp; \ + uint32_t _cmpval = *cmpval; \ + int res; \ + \ + __asm __volatile( \ + "1: mov %w1, #1 \n" \ + " ld"#a"xr %w0, [%2] \n" \ + " cmp %w0, %w3 \n" \ + " b.ne 2f \n" \ + " st"#l"xr %w1, %w4, [%2] \n" \ + "2:" \ + : "=&r"(tmp), "=&r"(res) \ + : "r" (p), "r" (_cmpval), "r" (newval) \ + : "cc", "memory" \ + ); \ + *cmpval = tmp; \ + \ + return (!res); \ +} \ + \ +static __inline int \ +atomic_fcmpset_##bar##64(volatile uint64_t *p, uint64_t *cmpval, \ + uint64_t newval) \ +{ \ + uint64_t tmp; \ + uint64_t _cmpval = *cmpval; \ + int res; \ + \ + __asm __volatile( \ + "1: mov %w1, #1 \n" \ + " ld"#a"xr %0, [%2] \n" \ + " cmp %0, %3 \n" \ + " b.ne 2f \n" \ + " st"#l"xr %w1, %4, [%2] \n" \ + "2:" \ + : "=&r"(tmp), "=&r"(res) \ + : "r" (p), "r" (_cmpval), "r" (newval) \ + : "cc", "memory" \ + ); \ + *cmpval = tmp; \ + \ + return (!res); \ +} + +ATOMIC_FCMPSET( , , ) +ATOMIC_FCMPSET(acq_, a, ) +ATOMIC_FCMPSET(rel_, ,l) + +#undef ATOMIC_FCMPSET + #define ATOMIC_CMPSET(bar, a, l) \ static __inline int \ atomic_cmpset_##bar##32(volatile uint32_t *p, uint32_t cmpval, \ @@ -311,6 +366,7 @@ atomic_store_rel_64(volatile uint64_t *p, uint64_t val) #define atomic_add_int atomic_add_32 +#define atomic_fcmpset_int atomic_fcmpset_32 #define atomic_clear_int atomic_clear_32 #define atomic_cmpset_int atomic_cmpset_32 #define atomic_fetchadd_int atomic_fetchadd_32 @@ -320,6 +376,7 @@ atomic_store_rel_64(volatile uint64_t *p, uint64_t val) #define atomic_subtract_int atomic_subtract_32 #define atomic_add_acq_int atomic_add_acq_32 +#define atomic_fcmpset_acq_int atomic_fcmpset_acq_32 #define atomic_clear_acq_int atomic_clear_acq_32 #define atomic_cmpset_acq_int atomic_cmpset_acq_32 #define atomic_load_acq_int atomic_load_acq_32 @@ -327,6 +384,7 @@ atomic_store_rel_64(volatile uint64_t *p, uint64_t val) #define atomic_subtract_acq_int atomic_subtract_acq_32 #define atomic_add_rel_int atomic_add_rel_32 +#define atomic_fcmpset_rel_int atomic_fcmpset_rel_32 #define atomic_clear_rel_int atomic_add_rel_32 #define atomic_cmpset_rel_int atomic_cmpset_rel_32 #define atomic_set_rel_int atomic_set_rel_32 @@ -334,6 +392,7 @@ atomic_store_rel_64(volatile uint64_t *p, uint64_t val) #define atomic_store_rel_int atomic_store_rel_32 #define atomic_add_long atomic_add_64 +#define atomic_fcmpset_long atomic_fcmpset_64 #define atomic_clear_long atomic_clear_64 #define atomic_cmpset_long atomic_cmpset_64 #define atomic_fetchadd_long atomic_fetchadd_64 @@ -343,6 +402,7 @@ atomic_store_rel_64(volatile uint64_t *p, uint64_t val) #define atomic_subtract_long atomic_subtract_64 #define atomic_add_ptr atomic_add_64 +#define atomic_fcmpset_ptr atomic_fcmpset_64 #define atomic_clear_ptr atomic_clear_64 #define atomic_cmpset_ptr atomic_cmpset_64 #define atomic_fetchadd_ptr atomic_fetchadd_64 @@ -352,6 +412,7 @@ atomic_store_rel_64(volatile uint64_t *p, uint64_t val) #define atomic_subtract_ptr atomic_subtract_64 #define atomic_add_acq_long atomic_add_acq_64 +#define atomic_fcmpset_acq_long atomic_fcmpset_acq_64 #define atomic_clear_acq_long atomic_add_acq_64 #define atomic_cmpset_acq_long atomic_cmpset_acq_64 #define atomic_load_acq_long atomic_load_acq_64 @@ -359,6 +420,7 @@ atomic_store_rel_64(volatile uint64_t *p, uint64_t val) #define atomic_subtract_acq_long atomic_subtract_acq_64 #define atomic_add_acq_ptr atomic_add_acq_64 +#define atomic_fcmpset_acq_ptr atomic_fcmpset_acq_64 #define atomic_clear_acq_ptr atomic_add_acq_64 #define atomic_cmpset_acq_ptr atomic_cmpset_acq_64 #define atomic_load_acq_ptr atomic_load_acq_64 @@ -366,6 +428,7 @@ atomic_store_rel_64(volatile uint64_t *p, uint64_t val) #define atomic_subtract_acq_ptr atomic_subtract_acq_64 #define atomic_add_rel_long atomic_add_rel_64 +#define atomic_fcmpset_rel_long atomic_fcmpset_rel_64 #define atomic_clear_rel_long atomic_clear_rel_64 #define atomic_cmpset_rel_long atomic_cmpset_rel_64 #define atomic_set_rel_long atomic_set_rel_64 @@ -373,6 +436,7 @@ atomic_store_rel_64(volatile uint64_t *p, uint64_t val) #define atomic_store_rel_long atomic_store_rel_64 #define atomic_add_rel_ptr atomic_add_rel_64 +#define atomic_fcmpset_rel_ptr atomic_fcmpset_rel_64 #define atomic_clear_rel_ptr atomic_clear_rel_64 #define atomic_cmpset_rel_ptr atomic_cmpset_rel_64 #define atomic_set_rel_ptr atomic_set_rel_64 diff --git a/sys/boot/Makefile.pc98 b/sys/boot/Makefile.pc98 deleted file mode 100644 index 84683991a645..000000000000 --- a/sys/boot/Makefile.pc98 +++ /dev/null @@ -1,3 +0,0 @@ -# $FreeBSD$ - -SUBDIR+= libstand32 diff --git a/sys/boot/common/Makefile.inc b/sys/boot/common/Makefile.inc index 1b2080a7772d..c83f00975814 100644 --- a/sys/boot/common/Makefile.inc +++ b/sys/boot/common/Makefile.inc @@ -7,8 +7,6 @@ SRCS+= module.c panic.c .if ${MACHINE} == "i386" || ${MACHINE_CPUARCH} == "amd64" SRCS+= load_elf32.c load_elf32_obj.c reloc_elf32.c SRCS+= load_elf64.c load_elf64_obj.c reloc_elf64.c -.elif ${MACHINE} == "pc98" -SRCS+= load_elf32.c load_elf32_obj.c reloc_elf32.c .elif ${MACHINE_CPUARCH} == "aarch64" SRCS+= load_elf64.c reloc_elf64.c .elif ${MACHINE_CPUARCH} == "arm" diff --git a/sys/boot/common/isapnp.h b/sys/boot/common/isapnp.h index 0f9956c4f183..a5b8f28304f7 100644 --- a/sys/boot/common/isapnp.h +++ b/sys/boot/common/isapnp.h @@ -45,15 +45,9 @@ /* Static ports to access PnP state machine */ #ifndef _KERNEL -#ifdef PC98 -/* pnp.h is included from pnpinfo.c. */ -#define _PNP_ADDRESS 0x259 -#define _PNP_WRITE_DATA 0xa59 -#else #define _PNP_ADDRESS 0x279 #define _PNP_WRITE_DATA 0xa79 #endif -#endif /* PnP Registers. Write to ADDRESS and then use WRITE/READ_DATA */ #define SET_RD_DATA 0x00 diff --git a/sys/boot/ficl/loader.c b/sys/boot/ficl/loader.c index 224619065790..50f70642cc5c 100644 --- a/sys/boot/ficl/loader.c +++ b/sys/boot/ficl/loader.c @@ -827,9 +827,7 @@ void ficlCompilePlatform(FICL_SYSTEM *pSys) SET_FOREACH(fnpp, Xficl_compile_set) (*fnpp)(pSys); -#if defined(PC98) - ficlSetEnv(pSys, "arch-pc98", FICL_TRUE); -#elif defined(__i386__) +#if defined(__i386__) ficlSetEnv(pSys, "arch-i386", FICL_TRUE); ficlSetEnv(pSys, "arch-powerpc", FICL_FALSE); #elif defined(__powerpc__) diff --git a/sys/boot/forth/frames.4th b/sys/boot/forth/frames.4th index 0f8d460aa7b4..b237afe7ac43 100644 --- a/sys/boot/forth/frames.4th +++ b/sys/boot/forth/frames.4th @@ -46,49 +46,26 @@ variable fill 124 constant ascii_pipe 43 constant ascii_plus -s" arch-pc98" environment? [if] - \ Single frames - 149 constant sh_el - 150 constant sv_el - 152 constant slt_el - 154 constant slb_el - 153 constant srt_el - 155 constant srb_el - \ Double frames - 149 constant dh_el - 150 constant dv_el - 152 constant dlt_el - 154 constant dlb_el - 153 constant drt_el - 155 constant drb_el - \ Fillings - 0 constant fill_none - 32 constant fill_blank - 135 constant fill_dark - 135 constant fill_med - 135 constant fill_bright -[else] - \ Single frames - 196 constant sh_el - 179 constant sv_el - 218 constant slt_el - 192 constant slb_el - 191 constant srt_el - 217 constant srb_el - \ Double frames - 205 constant dh_el - 186 constant dv_el - 201 constant dlt_el - 200 constant dlb_el - 187 constant drt_el - 188 constant drb_el - \ Fillings - 0 constant fill_none - 32 constant fill_blank - 176 constant fill_dark - 177 constant fill_med - 178 constant fill_bright -[then] +\ Single frames +196 constant sh_el +179 constant sv_el +218 constant slt_el +192 constant slb_el +191 constant srt_el +217 constant srb_el +\ Double frames +205 constant dh_el +186 constant dv_el +201 constant dlt_el +200 constant dlb_el +187 constant drt_el +188 constant drb_el +\ Fillings +0 constant fill_none +32 constant fill_blank +176 constant fill_dark +177 constant fill_med +178 constant fill_bright only forth definitions also frame-drawing diff --git a/sys/boot/mips/beri/boot2/Makefile b/sys/boot/mips/beri/boot2/Makefile index 46af76298e96..dec7d6110e95 100644 --- a/sys/boot/mips/beri/boot2/Makefile +++ b/sys/boot/mips/beri/boot2/Makefile @@ -52,7 +52,7 @@ CFLAGS= -ffreestanding \ -I${.CURDIR}/../../../.. \ -D_KERNEL \ -Wall \ - -G0 -Xassembler -G0 \ + -G0 \ -fno-pic -mno-abicalls \ -msoft-float \ -g diff --git a/sys/boot/pc98/Makefile b/sys/boot/pc98/Makefile deleted file mode 100644 index e8f9dbffe1e0..000000000000 --- a/sys/boot/pc98/Makefile +++ /dev/null @@ -1,5 +0,0 @@ -# $FreeBSD$ - -SUBDIR= boot0 boot0.5 pc98boot btx boot2 cdboot kgzldr libpc98 loader - -.include <bsd.subdir.mk> diff --git a/sys/boot/pc98/Makefile.inc b/sys/boot/pc98/Makefile.inc deleted file mode 100644 index 829793d63bd3..000000000000 --- a/sys/boot/pc98/Makefile.inc +++ /dev/null @@ -1,29 +0,0 @@ -# Common defines for all of /sys/boot/pc98/ -# -# $FreeBSD$ - -BINDIR?= /boot - -LOADER_ADDRESS?=0x200000 -CFLAGS+= -march=i386 -ffreestanding -CFLAGS.gcc+= -mpreferred-stack-boundary=2 -CFLAGS+= ${CFLAGS_NO_SIMD} -msoft-float -CFLAGS+= -Os -DPC98 -LDFLAGS+= -nostdlib - -# BTX components -.if exists(${.OBJDIR}/../btx) -BTXDIR= ${.OBJDIR}/../btx -.else -BTXDIR= ${.CURDIR}/../btx -.endif -BTXLDR= ${BTXDIR}/btxldr/btxldr -BTXKERN= ${BTXDIR}/btx/btx -BTXCRT= ${BTXDIR}/lib/crt0.o - -# compact binary with no padding between text, data, bss -LDSCRIPT= ${SRCTOP}/sys/boot/i386/boot.ldscript -LDFLAGS_BIN=-e start -Ttext ${ORG} -Wl,-T,${LDSCRIPT},-S,--oformat,binary -LD_FLAGS_BIN=-static -T ${LDSCRIPT} --gc-sections - -.include "../Makefile.inc" diff --git a/sys/boot/pc98/boot0.5/Makefile b/sys/boot/pc98/boot0.5/Makefile deleted file mode 100644 index ec40fe536ece..000000000000 --- a/sys/boot/pc98/boot0.5/Makefile +++ /dev/null @@ -1,26 +0,0 @@ -# $FreeBSD$ - -PROG= ${BOOT}.out -INTERNALPROG= -FILES= ${BOOT} -MAN= -SRCS= start.s boot.s boot0.5.s disk.s selector.s support.s syscons.s \ - putssjis.s -CLEANFILES= ${BOOT} ${BOOT}.bin - -BOOT= boot0.5 - -# The base address that we the boot0 code to to run it. Don't change this -# unless you are glutton for punishment. -BOOT_BOOT0_ORG?= 0x0000 - -LDFLAGS=-e start -Ttext ${BOOT_BOOT0_ORG} -Wl,-N,-T,${.CURDIR}/ldscript - -# The size of boot0.5 must be 7168 bytes -${BOOT}: ${BOOT}.bin - cat ${BOOT}.bin /dev/zero | ${DD} of=${BOOT} bs=1 count=7168 - -${BOOT}.bin: ${BOOT}.out - ${OBJCOPY} -S -O binary ${BOOT}.out ${.TARGET} - -.include <bsd.prog.mk> diff --git a/sys/boot/pc98/boot0.5/boot.s b/sys/boot/pc98/boot0.5/boot.s deleted file mode 100644 index 9d11206a882b..000000000000 --- a/sys/boot/pc98/boot0.5/boot.s +++ /dev/null @@ -1,174 +0,0 @@ -# Copyright (c) KATO Takenori, 1999, 2000. -# -# All rights reserved. Unpublished rights reserved under the copyright -# laws of Japan. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions -# are met: -# -# 1. Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer as -# the first lines of this file unmodified. -# 2. Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. -# -# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR -# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, -# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# -# $FreeBSD$ -# - - .code16 - - .text - .global boot -# -# Read bootstrap program and jump to it. -# -boot: - # Step 1: Save parameters - movw curdevice, %si - movb daua(%si), %al - movb %al, b_daua - shlw %si - movw secsize(%si), %ax - movw %ax, b_secsize - - movw curpartition, %si - movb partnum(%si), %al # %al = real partition number - xorb %ah, %ah - movw %ax, b_partn # save real parttion number - movb $5, %cl - shlw %cl, %si # %si = offset to parttable - addw $4, %si - movb parttable(%si), %al # IPLS - movb %al, b_sector - incw %si - movb parttable(%si), %al # IPLH - movb %al, b_head - incw %si # IPLC - movw parttable(%si), %ax - movw %ax, b_cylinder - - # Step 2: Calculate the segment address of the bootstrap routine - movw $0x1d00, %ax - movw b_secsize, %cx - shrw %cx - shrw %cx - subw %cx, %ax - subw $0x100, %ax - movw %ax, b_bootseg - - # Step 3: Read bootstrap code - movb $6, %ah - movb b_daua, %al - movw b_secsize, %bx - shlw %bx # 2 sectors - movw b_cylinder, %cx - movb b_head, %dh - movb b_sector, %dl - movw b_bootseg, %es - xorw %bp, %bp - int $0x1b - jc boot_error - - # Step 4: Set DA/UA into BIOS work area - xorw %ax, %ax - movw %ax, %es - movw $0x584, %bx # DISK_BOOT - movb b_daua, %dl - call write_biosparam - - call sc_clean - # Step 5: Set registers - # %ah: 00 - # %al: DA/UA - # %bx: Sector size * 2 - # %cx: cylinder number of boot partition - # %si: pointer to partition table - movw b_partn, %ax - movb $5, %cl - shl %cl, %ax # %ax = partition number * 32 - addw b_secsize, %ax - movw %ax, %si # %si = pointer to partition table - movw b_cylinder, %cx # %cx = cylinder - movb b_head, %dh # %dh = head - movb b_sector, %dl # %dl = sector - movw b_bootseg, %es # %es = boot segment - movb b_daua, %al # %al = DA/UA - movw b_secsize, %bx - shlw %bx # %bx = sector size * 2 - cli - movw %cs:iniss, %ss # Restore stack pointer - movw %cs:inisp, %sp - push %es # Boot segment - xorw %bp, %bp - push %bp # 0 - movw %ax, %di # Save %ax - xorw %ax, %ax - movw %ax, %ds # %ds = 0 - movw %di, %ax # Restore %ax - xorb %ah, %ah # %ah = 0 - xorw %di, %di # %di = 0 - sti - - # Jump to bootstrap code - lret - # NOTREACHED - -boot_error: - ret - -# -# Try to boot from default partition. -# - .global trydefault -trydefault: - movw ndevice, %cx - xorw %si, %si -trydefault_loop: - movw %si, curdevice - push %cx - push %si - call read_ipl - pop %si - pop %cx - cmpb $0x80, defpartflag - jne nodefpart - # Default partition is defined. - push %cx - movw npartition, %cx -srch_part: - movw %cx, %bx - decw %bx - movb defpartnum, %al # %al = real partition number - cmpb partnum(%bx), %al - jne not_match - movw %bx, curpartition # Store partition number - call boot -not_match: - loop srch_part - pop %cx -nodefpart: - incw %si - loop trydefault_loop - ret - - .data -b_daua: .byte 0 # DA/UA -b_head: .byte 0 # SYSH -b_sector: .byte 0 # SYSS -b_cylinder: .word 0 # SYSC -b_bootseg: .word 0 -b_secsize: .word 0 -b_partn: .word 0 # Real partition number diff --git a/sys/boot/pc98/boot0.5/boot0.5.s b/sys/boot/pc98/boot0.5/boot0.5.s deleted file mode 100644 index f87800656767..000000000000 --- a/sys/boot/pc98/boot0.5/boot0.5.s +++ /dev/null @@ -1,293 +0,0 @@ -# Copyright (c) KATO Takenori, 1999, 2000, 2007. -# -# All rights reserved. Unpublished rights reserved under the copyright -# laws of Japan. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions -# are met: -# -# 1. Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer as -# the first lines of this file unmodified. -# 2. Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. -# -# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR -# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, -# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# -# $FreeBSD$ -# - .global main - .code16 - - .text -main: - # Check hireso mode - movw $0x501, %bx # BIOS_FLAG - call read_biosparam - testb $0x08, %dl - jz normalmode - movb $1, ishireso -normalmode: - call sc_init - - # Display title and copyright. - movw $title, %di - call sc_puts - xorw %cx, %cx - movw $1, %dx - call sc_goto - movw $copyright, %di - call sc_puts - - # Scan hard drives - xorw %si, %si # number of partition - call scan_sasi # SASI/IDE - call scan_scsi # SCSI - movw %si, ndevice - orw %si, %si - jnz drives_found - jmp exit # No hard drives - -drives_found: - # Setup sector size dependent parameters - movw %si, %cx # %cx = number of devices -setup_loop: - movw %cx, %di - decw %di - shlw %di - movw secsize(%di), %ax - cmpw $1024, %ax - je setup_1024 - cmpw $512, %ax - je setup_512 - # 256 bytes/sector - movw $0x100, partoff(%di) - movw $0x0fa, defflagoff(%di) - movw $0x0fb, defpartoff(%di) - movw $8, maxpart(%di) - jmp setup_secsize_end - # 1024 bytes/sector -setup_1024: - # XXX Fix me! - movw $0x400, partoff(%di) - movw $0x3fa, defflagoff(%di) - movw $0x3fb, defpartoff(%di) - movb $32, maxpart(%di) - jmp setup_secsize_end - # 512 bytes/sector -setup_512: - movw $0x200, partoff(%di) - movw $0x1fa, defflagoff(%di) - movw $0x1fb, defpartoff(%di) - movb $16, maxpart(%di) -setup_secsize_end: - loop setup_loop - - # For debug with floppy, fake the parameter. - movw $0x584, %bx # DISK_BOOT - call read_biosparam - andb $0xf0, %dl - cmpb $0x90, %ah - jne boot_from_hdd - movb daua, %dl - call write_biosparam - -boot_from_hdd: - movw $500, %cx -wait_0_5: - call wait1ms - loop wait_0_5 - - # If the TAB is pressed, don't try to boot from default partition - xorw %di, %di # flag -wait_key_release: - call sc_iskeypress - orw %ax, %ax - jz key_release # KBD buffer empty. - call sc_getc - cmpb $0x0f, %ah # TAB - jne wait_key_release - # TAB pressed - movw $1, %di - jmp wait_key_release -key_release: - orw %di, %di - jnz dont_try_default # TAB pressed. - call trydefault - # Default partition not found. -dont_try_default: - call show_usage - call showdevices - call selector -exit: - ret -# -# Display usage -# -show_usage: - movw $44, %cx - movw $3, %dx - call sc_goto - movw $msg_usage1, %di - call sc_puts - movw $44, %cx - movw $4, %dx - call sc_goto - movw $msg_usage2, %di - call sc_puts - movw $44, %cx - movw $5, %dx - call sc_goto - movw $msg_usage3, %di - call sc_puts - movw $44, %cx - movw $7, %dx - call sc_goto - movw $msg_usage4, %di - call sc_puts - movw $44, %cx - movw $8, %dx - call sc_goto - movw $msg_usage5, %di - call sc_puts - movw $44, %cx - movw $9, %dx - call sc_goto - movw $msg_usage6, %di - call sc_puts - movw $44, %cx - movw $10, %dx - call sc_goto - movw $msg_usage7, %di - call sc_puts - movw $44, %cx - movw $11, %dx - call sc_goto - movw $msg_usage8, %di - call sc_puts - movw $44, %cx - movw $16, %dx - call sc_goto - movw $msg_usage9, %di - call sc_puts - movw $44, %cx - movw $17, %dx - call sc_goto - movw $msg_usage10, %di - call sc_puts - movw $44, %cx - movw $18, %dx - call sc_goto - movw $msg_usage11, %di - call sc_puts - movw $44, %cx - movw $19, %dx - call sc_goto - movw $msg_usage12, %di - call sc_puts - ret - -# -# Display device list -# -showdevices: - movw $2, %cx - movw $4, %dx - call sc_goto - movw $msg_device, %di - call sc_puts - xorw %si, %si # %si = device number - movw ndevice, %cx # %cx = number of devices -showdev_loop: - push %cx - movw $2, %cx - movw $5, %dx - addw %si, %dx - call sc_goto - # Check DA - movb daua(%si), %al - push %ax - andb $0xf0, %al - cmpb $0x80, %al - je show_sasi - cmpb $0xa0, %al - je show_scsi - # unknown device - movw $msg_unknown, %di - call sc_puts - jmp showunit - # SASI -show_sasi: - movw $msg_sasi, %di - call sc_puts - jmp showunit - # SCSI -show_scsi: - movw $msg_scsi, %di - call sc_puts - # Display unit number. -showunit: - pop %ax - andb $0x0f, %al - addb $'0', %al - call sc_putc - incw %si - pop %cx - loop showdev_loop - movw ndevice, %dx - addw $5, %dx - movw $2, %cx - call sc_goto - movw $msg_exitmenu, %di - call sc_puts - ret - - .data - .global curdevice, ndevice -ndevice: .word 0 # number of device -curdevice: .word 0 # current device - - .global ishireso -ishireso: .byte 0 - -title: .asciz "PC98 Boot Selector Version 1.2" -copyright: .ascii "(C)Copyright 1999-2007 KATO Takenori. " - .asciz "All rights reserved." -msg_device: .asciz "Device" -msg_sasi: .asciz "SASI/IDE unit " -msg_scsi: .asciz "SCSI ID " -msg_unknown: .asciz "unknown unit " -msg_exitmenu: .asciz "Exit this menu" -msg_usage1: .asciz "Device list" -msg_usage2: .asciz "UP, DOWN: select boot device" -msg_usage3: .asciz "RETURN: move to slice list" -msg_usage4: .asciz "Slice list" -msg_usage5: .asciz "UP, DOWN: select boot slice" -msg_usage6: .asciz "RETURN: boot" -msg_usage7: .asciz "SPACE: toggle default" -msg_usage8: .asciz "ESC: move to device list" -msg_usage9: .asciz "LEGEND" -msg_usage10: .asciz ">>: selected device/slice" -msg_usage11: .asciz "*: default slice to boot" -msg_usage12: .asciz "!: unbootable slice" - - .bss - .global daua, secsize, defflagoff, defpartoff - .global maxpart, partoff -daua: .space 12 # DA/DU list -secsize: .space 12 * 2 # Sector soize -defflagoff: .space 12 * 2 -defpartoff: .space 12 * 2 -maxpart: .space 12 * 2 -partoff: .space 12 * 2 diff --git a/sys/boot/pc98/boot0.5/disk.s b/sys/boot/pc98/boot0.5/disk.s deleted file mode 100644 index 6e8034898c82..000000000000 --- a/sys/boot/pc98/boot0.5/disk.s +++ /dev/null @@ -1,296 +0,0 @@ -# Copyright (c) KATO Takenori, 1999, 2000. -# -# All rights reserved. Unpublished rights reserved under the copyright -# laws of Japan. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions -# are met: -# -# 1. Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer as -# the first lines of this file unmodified. -# 2. Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. -# -# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR -# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, -# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# -# $FreeBSD$ -# - - .code16 - .text -# -# Check magic number at the end of the sector 0 -# -check_magic: - movw curdevice, %si - shlw %si - movw secsize(%si), %bx - decw %bx - decw %bx - movw iplbuf(%bx), %ax - cmpw $0xaa55, %ax - je magic_ok - movw $1, %ax - ret -magic_ok: - xorw %ax, %ax - ret - -# -# Copy partition table from buffer to parttable. -# -setup_partition: - push %cs - pop %es - movw curdevice, %bx - shlw %bx - movw maxpart(%bx), %cx # %cx = max num of partitions - movw partoff(%bx), %di - movw %di, %bx # %bx = offset to partition table - xorw %dx, %dx # %dx = partition number -setup_partition_loop: - push %cx - movw %dx, %si - movb $5, %cl - shlw %cl, %si - addw %bx, %si - movb iplbuf(%si), %al - orb %al, %al - jz unused_partition - addw $iplbuf, %si - movw npartition, %ax - movw %ax, %di - movb $5, %cl - shlw %cl, %di - addw $parttable, %di - movw $32, %cx - rep - movsb - movw %ax, %di - addw $partnum, %di - movb %dl, (%di) - incw npartition -unused_partition: - incw %dx - pop %cx - loop setup_partition_loop - ret - -# -# Read IPL and partition table in the current device. -# - .global read_ipl -read_ipl: - movw curdevice, %ax - movw %ax, %si # %si = device number - movw %ax, %di - shlw %di - - movw %cs, %ax - movw %ax, %es - movb $6, %ah - movb daua(%si), %al - movw $0x400, %bx - xorw %cx, %cx - xorw %dx, %dx - movw $iplbuf, %bp - int $0x1b - jc read_ipl_error - movw defflagoff(%di), %bx - movb iplbuf(%bx), %al - movb %al, defpartflag - incw %bx - movb iplbuf(%bx), %al - movb %al, defpartnum - movw $0, npartition - call check_magic - orw %ax, %ax - jnz no_magic - call setup_partition -no_magic: - xorw %ax, %ax -read_ipl_error: - xorw %bx, %bx - movw %bx, %es - ret - -# -# Restore IPL from the buffer -# - .global write_ipl -write_ipl: - movw curdevice, %ax - movw %ax, %si - movw %ax, %di - shlw %di - - # Restore default boot partition info. - movw defflagoff(%di), %bx - movb defpartflag, %al - movb %al, iplbuf(%bx) - incw %bx - movb defpartnum, %al - movb %al, iplbuf(%bx) - - movw %cs, %ax - movw %ax, %es - movb $5, %ah - movb daua(%si), %al - movw secsize(%di), %bx - xorw %cx, %cx - xorw %dx, %dx - movw $iplbuf, %bp - int $0x1b - jc write_ipl_error - xorw %ax, %ax -write_ipl_error: - xorw %bx, %bx - movw %bx, %es - ret - -# -# Scan HDD devices -# - .global scan_sasi, scan_scsi - # Scan SASI disk -scan_sasi: - # SASI Disk - movw $4, %cx - movw $0x0001, %ax # %ah = unit number, %al = for bit operation - -sasi_loop: - movw %si, %di - shlw %di - movw $0x55d, %bx # DISK_EQUIP - call read_biosparam - testb %al, %dl - jz no_sasi_unit - movb $0x80, %dh - addb %ah, %dh # %dh = DA/UA - movb %dh, daua(%si) # Store DA/UA - - # Try new sense command - push %ax - push %cx - movb %dh, %al - movb $0x84, %ah - int $0x1b - pop %cx - pop %ax - jc err_newsense - movw %bx, %dx - jmp found_sasi_unit - -err_newsense: - movw $0x457, %bx # capacity & sector size of IDE HDD - call read_biosparam - orb %ah, %ah - jz sasi_1 - cmpb $1, %ah - jz sasi_2 - - # SASI #3/#4 - movw $512, %dx # XXX - jmp found_sasi_unit - -sasi_1: - # SASI #1 - testb $0x80, %dl - jz sasi_256 - jmp sasi_512 -sasi_2: - # SASI #2 - testb $0x40, %dl - jz sasi_256 - jmp sasi_512 - -sasi_256: - movw $256, %dx - jmp found_sasi_unit -sasi_512: - movw $512, %dx -found_sasi_unit: - movw %dx, secsize(%di) - incw %si -no_sasi_unit: - incb %ah - shlb %al - loop sasi_loop - ret - -# -# Scan SCSI disk -# SI number of disks -# destroyed: %ax, %bx, %cx, %dx -scan_scsi: - movw $8, %cx - movw $0x0001, %ax # %ah = ID number, %al = for bit operation -scsi_loop: - # Check whether drive exist. - movw %si, %di - shlw %di - movw $0x482, %bx # DISK_EQUIPS - call read_biosparam - testb %al, %dl - jz no_scsi_unit - xorw %bx, %bx - movb %ah, %bl - shlw %bx - shlw %bx - addw $0x460, %bx # SCSI parameter block - call read_biosparam - orb %dl, %dl - jz no_scsi_unit - - # SCSI harddrive found. - movb $0xa0, %dh - addb %ah, %dh - movb %dh, daua(%si) - - # Check sector size. - addw $3, %bx - call read_biosparam - andb $0x30, %dl - cmpb $0x20, %dl - je scsi_1024 - cmpb $0x10, %dl - je scsi_512 - movw $256, %dx - jmp found_scsi -scsi_1024: - movw $1024, %dx - jmp found_scsi -scsi_512: - movw $512, %dx -found_scsi: - movw %dx, secsize(%di) - incw %si -no_scsi_unit: - incb %ah - shlb %al - loop scsi_loop - ret - - .data - .global defpartflag, defpartnum, npartition -defpartflag: .byte 0 -defpartnum: .byte 0 -npartition: .word 0 # number of partitions - - .bss - .global partnum, parttable -iplbuf: .space 0x400 # Read buffer for IPL -partnum: .space 32 # Index of parttable -parttable: .space 1024 # Copy of valid partition table diff --git a/sys/boot/pc98/boot0.5/ldscript b/sys/boot/pc98/boot0.5/ldscript deleted file mode 100644 index 49044abfb159..000000000000 --- a/sys/boot/pc98/boot0.5/ldscript +++ /dev/null @@ -1,12 +0,0 @@ -/* - * $FreeBSD$ - */ - -SECTIONS -{ - .text : { *(.text) } - .data : { *(.data) } - . = 0x1243; - .putssjis : { *(.putssjis) } - .bss : { *(.bss) } -} diff --git a/sys/boot/pc98/boot0.5/putssjis.s b/sys/boot/pc98/boot0.5/putssjis.s deleted file mode 100644 index 221b9e67818b..000000000000 --- a/sys/boot/pc98/boot0.5/putssjis.s +++ /dev/null @@ -1,137 +0,0 @@ -# Copyright (c) KATO Takenori, 2007. -# -# All rights reserved. Unpublished rights reserved under the copyright -# laws of Japan. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions -# are met: -# -# 1. Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer as -# the first lines of this file unmodified. -# 2. Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. -# -# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR -# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, -# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# -# $FreeBSD$ -# - - .code16 - .section .putssjis, "awx", @progbits - - # - # Display string with Shift-JIS support - # %si: address of string, %di: T-VRAM address, %cx: count - # - - # Absolute address of putssjis_entry must be 0x1243. -putssjis_entry: - push %es - push %ax - # Setup the T-VRAM segement address. - xorw %ax, %ax - movw %ax, %es - movw $0xa000, %ax - testb $0x08, %es:0x501 - jz normalmode - movw $0xe000, %ax -normalmode: - movw %ax, %es - -putssjis_loop: - lodsw - call check_sjis - jc put_2byte_char - - # 1 byte character - xorb %ah, %ah - testb $0xe0, %al # Check control code. - jnz put_1byte_char - movb $0x20, %al # Convert control code into the space. -put_1byte_char: - stosw - decw %si - jmp putssjis_loop_end - -put_2byte_char: - subb $0x20, %al - - # Check 2byte "hankaku" - cmp $0x09, %al - je put_2byte_hankaku - cmp $0x0a, %al - je put_2byte_hankaku - cmp $0x0b, %al - je put_2byte_hankaku - jmp put_2byte_zenkaku - -put_2byte_hankaku: - stosw - jmp putssjis_loop_end - -put_2byte_zenkaku: - stosw - orb $0x80, %ah - stosw - decw %cx - -putssjis_loop_end: - loop putssjis_loop - - pop %ax - pop %es - ret - - # Check 2-byte code. -check_sjis: - cmpb $0x80, %al - jbe found_ank_kana - cmpb $0xa0, %al - jb found_2byte_char - cmpb $0xe0, %al - jb found_ank_kana - cmpb $0xf0, %al - jae found_ank_kana - jmp found_2byte_char -found_ank_kana: - clc - ret - -found_2byte_char: - # Convert Shift-JIS into JIS. - cmpb $0x9f, %al - ja sjis_h_2 # Upper > 0x9f - subb $0x71, %al # Upper -= 0x71 - jmp sjis_lower -sjis_h_2: - subb $0xb1, %al # Upper -= 0xb1 -sjis_lower: - salb %al # Upper *= 2 - incb %al # Upper += 1 - - cmpb $0x7f, %ah - jbe sjis_l_2 - decb %ah # Lower -= 1 if lower > 0x7f -sjis_l_2: - cmpb $0x9e, %ah - jb sjis_l_3 - subb $0x7d, %ah # Lower -= 0x7d - incb %al # Upper += 1 - jmp check_2byte_end -sjis_l_3: - subb $0x1f, %ah # Lower -= 0x1f -check_2byte_end: - stc - ret diff --git a/sys/boot/pc98/boot0.5/selector.s b/sys/boot/pc98/boot0.5/selector.s deleted file mode 100644 index 9d98ef866d17..000000000000 --- a/sys/boot/pc98/boot0.5/selector.s +++ /dev/null @@ -1,450 +0,0 @@ -# Copyright (c) KATO Takenori, 1999, 2000, 2007. -# -# All rights reserved. Unpublished rights reserved under the copyright -# laws of Japan. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions -# are met: -# -# 1. Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer as -# the first lines of this file unmodified. -# 2. Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. -# -# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR -# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, -# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# -# $FreeBSD$ -# - - .code16 - - .text -# -# Display partition table. -# -showpartitions: - # Clear partition table area - movw $16, %cx -clear_part: - push %cx - movw %cx, %dx - decw %dx - addw $5, %dx - movw $20, %cx - call sc_goto - movw $msg_spc, %di - call sc_puts - pop %cx - loop clear_part - - # Check `Exit' menu - movw curdevice, %ax - cmpw ndevice, %ax - je no_slice - - # XXX Move this to a suitable place! - movw $22, %cx - movw $4, %dx - call sc_goto - movw $msg_slice, %di - call sc_puts - - # Check the number of partitions - movw npartition, %cx - orw %cx, %cx - jnz partitionexist -no_slice: - # Just show the `no slice' message. - movw $22, %cx - movw $5, %dx - call sc_goto - movw $msg_noslice, %di - call sc_puts - ret -partitionexist: - xorw %si, %si # %si = partition number -showpart_loop: - push %cx # %cx = number of partitions - movw $22, %cx - movw %si, %dx - addw $5, %dx - call sc_goto - movw %si, %di - movb $5, %cl - shlw %cl, %di - addw $0x10, %di # SYSM field - # SYSM: space filled string. Don't use sc_puts. - movw $16, %cx -showpart_name: - push %cx - movb parttable(%di), %al - call sc_putc - incw %di - pop %cx - loop showpart_name - incw %si - pop %cx - loop showpart_loop - ret - -# -# Show default slice indicator -# If the default boot slice exists, `*' indicator will be showed. -# -showdefaultslicemark: - cmpb $0x80, defpartflag - je defpartexist - ret -defpartexist: - movw npartition, %cx -defslice_loop: - movw %cx, %bx - decw %bx - push %cx - push %bx - movw $40, %cx - movw %bx, %dx - addw $5, %dx - call sc_goto - - pop %bx - pop %cx - movb defpartnum, %al - cmpb partnum(%bx), %al - jne nomatch - movb $'*', %al - call sc_putc - jmp defslice_done -nomatch: - movb $' ', %al - call sc_putc -defslice_done: - loop defslice_loop - ret - -# -# Hide default slice indicator -# -hidedefaultslicemark: - movw $16, %cx -hidedefslice_loop: - push %cx - movw %cx, %dx - addw $4, %dx - movw $40, %cx - call sc_goto - movb $' ', %al - call sc_putc - pop %cx - loop hidedefslice_loop - ret - -# -# Toggle default slice -# -toggle_default: - cmpb $0x80, defpartflag - jne set_default - # Clear default - movb $0, defpartflag - call write_ipl # Restore - call hidedefaultslicemark - ret - # Set default slice -set_default: - movw curpartition, %si - movb partnum(%si), %al # %al = real partition number - movb $5, %cl - shlw %cl, %si - # Default slice must be bootable - testb $0x80, parttable(%si) - jnz curpart_bootable - # Current partition is not bootable. - ret -curpart_bootable: - movb $0x80, defpartflag - movb %al, defpartnum - call write_ipl # Restore - call showdefaultslicemark - ret - -# -# Show/hide cursor -# -show_devcurs: - xorw %cx, %cx - movw curdevice, %dx - addw $5, %dx - call sc_goto - movb $'>', %al - call sc_putc - movb $'>', %al - call sc_putc - ret - -hide_devcurs: - xorw %cx, %cx - movw curdevice, %dx - addw $5, %dx - call sc_goto - movb $' ', %al - call sc_putc - movb $' ', %al - call sc_putc - ret - -show_slicecurs: - movw $20, %cx - movw curpartition, %dx - addw $5, %dx - call sc_goto - movb $'>', %al - call sc_putc - movb $'>', %al - call sc_putc - ret - -hide_slicecurs: - movw $20, %cx - movw curpartition, %dx - addw $5, %dx - call sc_goto - movb $' ', %al - call sc_putc - movb $' ', %al - call sc_putc - ret - -isforceboot: - xorw %cx, %cx - movw $20, %dx - call sc_goto - movw $msg_force, %di - call sc_puts - call sc_getc - push %ax - xorw %cx, %cx - movw $20, %dx - call sc_goto - movw $msg_forceclr, %di - call sc_puts - pop %ax - cmpb $0x15, %ah - je force_yes - xorw %ax, %ax - ret -force_yes: - movw $1, %ax - ret - -# -# Main loop for device mode -# -devmode: - call read_ipl - call hidedefaultslicemark - call showpartitions - call showdefaultslicemark - call show_devcurs - - movw $2, %cx - movw $4, %dx - call sc_goto - movb $0xe5, %al - movw $6, %cx - call sc_setattr - movw $22, %cx - movw $4, %dx - call sc_goto - movb $0xe1, %al - movw $5, %cx - call sc_setattr - movw $44, %cx - movw $3, %dx - call sc_goto - movb $0xe5, %al - movw $11, %cx - call sc_setattr - movw $44, %cx - movw $7, %dx - call sc_goto - movb $0xe1, %al - movw $10, %cx - call sc_setattr - -devmode_loop: - call sc_getc - movw ndevice, %bx - cmpb $0x3a, %ah # UP - je dev_up - cmpb $0x3d, %ah # DOWN - je dev_down - cmpb $0x3c, %ah # RIGHT - je dev_right - cmpb $0x1c, %ah # RETURN - jne devmode_loop - cmpw curdevice, %bx - jne dev_right - movw $3, mode # N88-BASIC - ret - - # XXX - .space 5, 0x90 - ret # Dummy ret @0x9ab - -dev_up: - cmpw $0, curdevice - je devmode_loop - call hide_devcurs - decw curdevice - call read_ipl - call hidedefaultslicemark - call showpartitions - call showdefaultslicemark - call show_devcurs - jmp devmode_loop -dev_down: - cmpw curdevice, %bx - je devmode_loop - call hide_devcurs - incw curdevice - call read_ipl - call hidedefaultslicemark - call showpartitions - call showdefaultslicemark - call show_devcurs - jmp devmode_loop -dev_right: - cmpw curdevice, %bx - je devmode_loop - movw $1, mode # Slice mode - ret - -# -# main loop for slice mode -# -slicemode: - movw $0, curpartition - call show_slicecurs - movw $2, %cx - movw $4, %dx - call sc_goto - movb $0xe1, %al - movw $6, %cx - call sc_setattr - movw $22, %cx - movw $4, %dx - call sc_goto - movb $0xe5, %al - movw $5, %cx - call sc_setattr - movw $44, %cx - movw $3, %dx - call sc_goto - movb $0xe1, %al - movw $11, %cx - call sc_setattr - movw $44, %cx - movw $7, %dx - call sc_goto - movb $0xe5, %al - movw $10, %cx - call sc_setattr - -slicemode_loop: - call sc_getc - cmpb $0x3a, %ah # UP - je slice_up - cmpb $0x3d, %ah # DOWN - je slice_down - cmpb $0x3b, %ah # LEFT - je slice_esc - cmpb $0x00, %ah # ESC - je slice_esc - cmpb $0x1c, %ah # RETURN - je slice_ret - cmpb $0x34, %ah # SPC - je slice_spc - cmpb $0x62, %ah # f1 - je slice_spc - jmp slicemode_loop -slice_up: - cmpw $0, curpartition - je slicemode_loop - call hide_slicecurs - decw curpartition - call show_slicecurs - jmp slicemode_loop -slice_down: - movw curpartition, %bx - movw npartition, %ax - decw %ax - cmpw %bx, %ax - je slicemode_loop - call hide_slicecurs - incw curpartition - call show_slicecurs - jmp slicemode_loop -slice_esc: - movw $0, mode # Device mode - ret -slice_spc: - call toggle_default - jmp slicemode_loop -slice_ret: - # Test bit 7 of mid - movw curpartition, %si - movb $5, %cl - shlw %cl, %si - testb $0x80, parttable(%si) - jnz bootable_slice - call isforceboot - orw %ax, %ax - jz slicemode_loop -bootable_slice: - call boot - jmp slicemode_loop - -# -# Main loop -# - .global selector -selector: - movw $0, curdevice # trydefault may change the curdevice. - movw $0, mode - -selector_loop: - cmpw $0, mode - je status_dev - cmpw $1, mode - je status_slice - ret -status_dev: - call devmode - jmp selector_loop -status_slice: - call slicemode - jmp selector_loop - - .data - .global curpartition -curpartition: .word 0 # current patition -mode: .word 0 - -msg_spc: .asciz " " -msg_slice: .asciz "Slice" -msg_noslice: .asciz "no slice" -msg_force: .asciz "This slice is not bootable. Continue? (Y / [N])" -msg_forceclr: .asciz " " diff --git a/sys/boot/pc98/boot0.5/start.s b/sys/boot/pc98/boot0.5/start.s deleted file mode 100644 index 008ae66b15e3..000000000000 --- a/sys/boot/pc98/boot0.5/start.s +++ /dev/null @@ -1,73 +0,0 @@ -# Copyright (c) KATO Takenori, 1999, 2000, 2007. -# -# All rights reserved. Unpublished rights reserved under the copyright -# laws of Japan. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions -# are met: -# -# 1. Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer as -# the first lines of this file unmodified. -# 2. Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. -# -# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR -# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, -# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# -# $FreeBSD$ -# - .global start - .code16 - - .text -start: - jmp start1 - - # Magic - .org 0x053, 0x20 - .byte 0x4e, 0x45, 0x43 - - .org 0x8f - .byte 0x32, 0x2e, 0x37, 0x30 - - .org 0x2d4 -start1: - # The instruction 'call 0x9ab' can be here. See also selector.s. - nop - nop - nop - cli - movw %cs, %ax - movw %ax, %ds - movw %ss, iniss - movw %sp, inisp - movw %ax, %ss - movw $0xfffe, %sp - sti - xorw %ax, %ax - movw %ax, %es - call main - - cli - movw %cs:iniss, %ss - movw %cs:inisp, %sp - sti - int $0x1e - # NOTREACHED - lret - - .data - .global iniss, inisp -iniss: .word 0 -inisp: .word 0 diff --git a/sys/boot/pc98/boot0.5/support.s b/sys/boot/pc98/boot0.5/support.s deleted file mode 100644 index df1115bdaaeb..000000000000 --- a/sys/boot/pc98/boot0.5/support.s +++ /dev/null @@ -1,94 +0,0 @@ -# Copyright (c) KATO Takenori, 1999, 2000. -# -# All rights reserved. Unpublished rights reserved under the copyright -# laws of Japan. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions -# are met: -# -# 1. Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer as -# the first lines of this file unmodified. -# 2. Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. -# -# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR -# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, -# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# -# $FreeBSD$ -# - - .code16 - - .text -# -# Wait 1ms -# - .global wait1ms -wait1ms: - push %cx - movw $800, %cx -wait_loop: - outb %al, $0x5f - loop wait_loop - pop %cx - ret - -# -# Read one byte from BIOS parameter block -# %bx offset -# %dl value -# - .global read_biosparam -read_biosparam: - movb %es:(%bx), %dl - ret - -# -# Write one byte to BIOS parameter block -# %bx offset -# %dl value -# - .global write_biosparam -write_biosparam: - movb %dl, %es:(%bx) - ret - -# -# beep -# - .global beep_on, beep_off, beep -beep_on: - movb $0x17, %ah - int $0x18 - ret - -beep_off: - movb $0x18, %ah - int $0x18 - ret - -beep: - push %cx - call beep_on - movw $100, %cx -beep_loop1: - call wait1ms - loop beep_loop1 - call beep_off - movw $50, %cx -beep_loop2: - call wait1ms - loop beep_loop2 - pop %cx - ret diff --git a/sys/boot/pc98/boot0.5/syscons.s b/sys/boot/pc98/boot0.5/syscons.s deleted file mode 100644 index 150b835f795d..000000000000 --- a/sys/boot/pc98/boot0.5/syscons.s +++ /dev/null @@ -1,253 +0,0 @@ -# Copyright (c) KATO Takenori, 1999, 2000. -# -# All rights reserved. Unpublished rights reserved under the copyright -# laws of Japan. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions -# are met: -# -# 1. Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer as -# the first lines of this file unmodified. -# 2. Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. -# -# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR -# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, -# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# -# $FreeBSD$ -# - - .code16 - - .text -# -# %al character code -# destroyed: %al, %bx -# -put_character: - movw $0xe000, %bx - movb ishireso, %ah - orb %ah, %ah - jne hireso_ch - movw $0xa000, %bx -hireso_ch: - movw %bx, %es - xorb %ah, %ah - movw curpos, %bx - movw %ax, %es:(%bx) - xorw %ax, %ax - movw %ax, %es - ret - -# -# %al attribute -# destroyed: %ah, %cx -# -set_attribute: - movw $0xe200, %bx - movb ishireso, %ah - orb %ah, %ah - jne hireso_ch - movw $0xa200, %bx -hireso_attr: - movw %bx, %es - xorb %ah, %ah - movw curpos, %bx - movw %ax, %es:(%bx) - xorw %bx, %bx - movw %bx, %es - ret - -# -# Put a character -# %al: character code -# destroyed: %ah, %bx, %cx -# - .global sc_putc -sc_putc: - call put_character - incw curpos - incw curpos - cmpw $4000, curpos - jng putc_end - movw $0, curpos -putc_end: - ret - -# -# Put a null terminated string -# %di: pointer to string -# destroyed: %ah, %cx, %di -# - .global sc_puts -sc_puts: - movb (%di), %al - orb %al, %al - jz puts_end - call sc_putc - incw %di - jmp sc_puts -puts_end: - ret - -# -# Change the current cursor position -# %cx: X -# %dx: Y -# destroyed: %ax, %bx -# - .global sc_goto -sc_goto: - movw %dx, %ax # AX=Y - shlw %ax # AX=Y*64 - shlw %ax - shlw %ax - shlw %ax - shlw %ax - shlw %ax - movw %dx, %bx # BX=Y - shlw %bx # BX=Y*16 - shlw %bx - shlw %bx - shlw %bx - addw %bx, %ax # AX=Y*64+Y*16=Y*80 - addw %cx, %ax - shlw %ax - movw %ax, curpos - ret - -# -# Clear screen -# destroyed: %ax, %bx -# - .global sc_clean -sc_clean: - movb $0x16, %ah - movw $0xe120, %dx - int $0x18 # KBD/CRT BIOS - movw $0, curpos - ret - -# -# Set sttribute code -# %al: attribute -# %cx: count -# destroyed: %ax, %bx, %cx -# - .global sc_setattr -sc_setattr: - call set_attribute - incw curpos - incw curpos - loop sc_setattr - -# -# Sense the state of shift key -# destroyed: %ax -# - .global sc_getshiftkey -sc_getshiftkey: - movb $2, %ah # Sense KB_SHIFT_COD - int $0x18 # KBD/CRT BIOS - xorb %ah, %ah - ret - -# -# Check KBD buffer -# - .global sc_iskeypress -sc_iskeypress: - mov $1, %ah - int $0x18 # KBD/CRT BIOS - testb $1, %bh - jz no_key - movw $1, %ax - ret -no_key: - xorw %ax, %ax - ret - -# -# Read from KBD -# - .global sc_getc -sc_getc: - xorb %ah, %ah - int $0x18 - ret - -# -# Initialize CRT (normal mode) -# -init_screen_normal: - # Disable graphic screen - movb $0x41, %ah - int $0x18 - # Init graphic screen - movb $0x42, %al - movb $0xc0, %ch - int $0x18 - # 80x25 mode - movw $0x0a00, %ax - int $0x18 - ret - -# -# Initialize CRT (hireso mode) -# -init_screen_hireso: - # Init RAM window - movb $8, %al - outb %al, $0x91 - movb $0x0a, %al - outb %al, $0x93 - # 80x31 mode - movw $0x0a00, %ax - int $0x18 - ret - -# -# Initialize screen (internal) -# -init_screen: - movb ishireso, %ah - orb %ah, %ah - jne hireso_ini - call init_screen_normal - jmp init_next -hireso_ini: - call init_screen_hireso -init_next: - movb $0x0c, %ah - int $0x18 - # cursor home and off - xorw %dx, %dx - movb $0x13, %ah - int $0x18 - movb $0x12, %ah - int $0x18 - ret - -# -# Initialize screeen -# - .global sc_init -sc_init: - call init_screen - call sc_clean - movw $0, curpos - ret - - .data -curpos: .word 0 # Current cursor position diff --git a/sys/boot/pc98/boot0/Makefile b/sys/boot/pc98/boot0/Makefile deleted file mode 100644 index d348f6020e41..000000000000 --- a/sys/boot/pc98/boot0/Makefile +++ /dev/null @@ -1,19 +0,0 @@ -# $FreeBSD$ - -PROG= ${BOOT} -INTERNALPROG= -FILES= ${BOOT} -MAN= -SRCS= ${BOOT}.s -CLEANFILES= ${BOOT} - -BOOT= boot0 - -# The base address that we the boot0 code to to run it. Don't change this -# unless you are glutton for punishment. -BOOT_BOOT0_ORG?= 0x0000 -ORG=${BOOT_BOOT0_ORG} - -LDFLAGS=${LDFLAGS_BIN} - -.include <bsd.prog.mk> diff --git a/sys/boot/pc98/boot0/boot0.s b/sys/boot/pc98/boot0/boot0.s deleted file mode 100644 index 508e2521157a..000000000000 --- a/sys/boot/pc98/boot0/boot0.s +++ /dev/null @@ -1,108 +0,0 @@ -# Copyright (c) KATO Takenori, 1999, 2000. -# -# All rights reserved. Unpublished rights reserved under the copyright -# laws of Japan. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions -# are met: -# -# 1. Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer as -# the first lines of this file unmodified. -# 2. Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. -# 3. The name of the author may not be used to endorse or promote products -# derived from this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR -# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, -# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# -# $FreeBSD$ - - .globl start - .code16 -start: - jmp main - - .org 4 - .ascii "IPL1" - .byte 0, 0, 0 - - .globl start -main: - xor %ax, %ax - mov %ax, %ds - mov (0x584), %al # DA/UA - mov %al, %ah - and $0xf0, %ah - cmp $0x90, %ah - je fdd - - # hdd - mov $6, %ah - mov $0x3000, %bx - mov %bx, %es - mov $0x2000, %bx - xor %cx, %cx - xor %dx, %dx - xor %bp, %bp - int $0x1b - jc error_hdd - - push %ax - mov %es, %ax - add $0x40, %ax - mov %ax, %es - pop %ax - push %es - push %bp - lret - - # fdd -fdd: - xor %di, %di -fdd_retry: - mov $0xd6, %ah - mov $0x3000, %bx - mov %bx, %es - mov $0x2000, %bx - mov $0x0200, %cx - mov $0x0001, %dx - xor %bp, %bp - int $0x1b - jc error - push %ax - mov %es, %ax - add $0x40, %ax - mov %ax, %es - pop %ax - push %es - push %bp - lret - -error: - or %di, %di - jnz error_hdd - and $0x0f, %al - or $0x30, %al - jmp fdd_retry - -error_hdd: - jmp error - - .org 0x1fa - .byte 0 # defflag_off - .byte 0 # defpart_off - .byte 1 # menu version - .byte 0 - .word 0xaa55 diff --git a/sys/boot/pc98/boot2/Makefile b/sys/boot/pc98/boot2/Makefile deleted file mode 100644 index 2db0590964a2..000000000000 --- a/sys/boot/pc98/boot2/Makefile +++ /dev/null @@ -1,116 +0,0 @@ -# $FreeBSD$ - -.include <bsd.own.mk> - -FILES= boot boot1 boot2 - -NM?= nm - -BOOT_COMCONSOLE_PORT?= 0x238 -BOOT_COMCONSOLE_SPEED?= 9600 -B2SIOFMT?= 0x3 - -REL1= 0x700 -ORG1= 0 -ORG2= 0x2000 - -# Decide level of UFS support. -BOOT2_UFS?= UFS1_AND_UFS2 -#BOOT2_UFS?= UFS2_ONLY -#BOOT2_UFS?= UFS1_ONLY - -CFLAGS= -fomit-frame-pointer \ - -mrtd \ - -mregparm=3 \ - -D${BOOT2_UFS} \ - -DFLAGS=${BOOT_BOOT1_FLAGS} \ - -DSIOPRT=${BOOT_COMCONSOLE_PORT} \ - -DSIOFMT=${B2SIOFMT} \ - -DSIOSPD=${BOOT_COMCONSOLE_SPEED} \ - -I${.CURDIR}/../../.. \ - -I${.CURDIR}/../../i386/boot2 \ - -I${.CURDIR}/../../common \ - -I${.CURDIR}/../btx/lib -I. \ - -Wall -Waggregate-return -Wbad-function-cast -Wcast-align \ - -Wmissing-declarations -Wmissing-prototypes -Wnested-externs \ - -Wpointer-arith -Wshadow -Wstrict-prototypes -Wwrite-strings \ - -Winline - -CFLAGS.gcc+= -Os \ - -fno-guess-branch-probability \ - -fno-unit-at-a-time \ - --param max-inline-insns-single=100 -.if ${COMPILER_TYPE} == "gcc" && ${COMPILER_VERSION} <= 40201 -CFLAGS.gcc+= -mno-align-long-strings -.endif - -# Set machine type to PC98_SYSTEM_PARAMETER -#CFLAGS+= -DSET_MACHINE_TYPE - -# Initialize the bi_bios_geom using the BIOS geometry -#CFLAGS+= -DGET_BIOSGEOM - -CFLAGS.clang+= -Oz ${CLANG_OPT_SMALL} - -LD_FLAGS=${LD_FLAGS_BIN} - -# Pick up ../Makefile.inc early. -.include <bsd.init.mk> - -.PATH: ${.CURDIR}/../../i386/boot2 - -CLEANFILES= boot - -boot: boot1 boot2 - cat boot1 boot2 > boot - -CLEANFILES+= boot1 boot1.out boot1.o - -boot1: boot1.out - ${OBJCOPY} -S -O binary boot1.out ${.TARGET} - -boot1.out: boot1.o - ${LD} ${LD_FLAGS} -e start -Ttext ${ORG1} -o ${.TARGET} boot1.o - -CLEANFILES+= boot2 boot2.ld boot2.ldr boot2.bin boot2.out boot2.o \ - boot2.s boot2.s.tmp boot2.h sio.o - -boot2: boot2.ld - @set -- `ls -l boot2.ld`; x=$$((7680-$$5)); \ - echo "$$x bytes available"; test $$x -ge 0 - ${DD} if=boot2.ld of=${.TARGET} obs=7680 conv=osync - -boot2.ld: boot2.ldr boot2.bin ${BTXKERN} - btxld -v -E ${ORG2} -f bin -b ${BTXKERN} -l boot2.ldr \ - -o ${.TARGET} -P 1 boot2.bin - -boot2.ldr: - ${DD} if=/dev/zero of=${.TARGET} bs=276 count=1 - -boot2.bin: boot2.out - ${OBJCOPY} -S -O binary boot2.out ${.TARGET} - -boot2.out: ${BTXCRT} boot2.o sio.o - ${LD} ${LD_FLAGS} -Ttext ${ORG2} -o ${.TARGET} ${.ALLSRC} - -boot2.o: boot2.s - ${CC} ${ACFLAGS} -c boot2.s - -SRCS= boot2.c boot2.h - -boot2.s: boot2.c boot2.h ${.CURDIR}/../../common/ufsread.c - ${CC} ${CFLAGS} -S -o boot2.s.tmp ${.CURDIR}/boot2.c - sed -e '/align/d' -e '/nop/d' < boot2.s.tmp > boot2.s - rm -f boot2.s.tmp - -boot2.h: boot1.out - ${NM} -t d ${.ALLSRC} | awk '/([0-9])+ T (read|putc)/ \ - { x = $$1 - ORG1; \ - printf("#define %sORG %#x\n", toupper($$3), REL1 + x) }' \ - ORG1=`printf "%d" ${ORG1}` \ - REL1=`printf "%d" ${REL1}` > ${.TARGET} - -.include <bsd.prog.mk> - -# XXX: clang integrated-as doesn't grok .codeNN directives yet -CFLAGS.boot1.S= ${CLANG_NO_IAS} diff --git a/sys/boot/pc98/boot2/boot1.S b/sys/boot/pc98/boot2/boot1.S deleted file mode 100644 index 5c972061d07c..000000000000 --- a/sys/boot/pc98/boot2/boot1.S +++ /dev/null @@ -1,395 +0,0 @@ -/*- - * Copyright (c) 2008-2009 TAKAHASHI Yoshihiro - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * $FreeBSD$ - */ - -/* Memory Locations */ - .set STACK_OFF,0x6000 # Stack offset - .set LOAD_SIZE,8192 # Load size - .set DAUA,0x0584 # DA/UA - .set MEM_REL,0x700 # Relocation address - .set MEM_ARG,0x900 # Arguments - .set MEM_BUF,0x8cec # Load area - .set MEM_BTX,0x9000 # BTX start - .set MEM_JMP,0x9010 # BTX entry point - .set MEM_USR,0xa000 # Client start - -/* PC98 machine type from sys/pc98/pc98/pc98_machdep.h */ - .set MEM_SYS, 0xa100 # System common area segment - .set PC98_MACHINE_TYPE, 0x0620 # PC98 machine type - .set EPSON_ID, 0x0624 # EPSON machine id - - .set M_NEC_PC98, 0x0001 - .set M_EPSON_PC98, 0x0002 - .set M_NOT_H98, 0x0010 - .set M_H98, 0x0020 - .set M_NOTE, 0x0040 - .set M_NORMAL, 0x1000 - .set M_8M, 0x8000 - -/* Partition Constants */ - .set PRT_OFF,0x1be # Partition offset - -/* Misc. Constants */ - .set SIZ_PAG,0x1000 # Page size - .set SIZ_SEC,0x200 # Sector size - - .set NSECT,0x10 - - .globl start - .globl read - .globl putc - .code16 - -start: jmp main - -boot_cyl: .org 4 - .ascii "IPL1 " - -main: cld - - /* Setup the stack */ - xor %si,%si - mov %si,%ss - mov $STACK_OFF,%sp - - push %cx - - /* Relocate ourself to MEM_REL */ - push %cs - pop %ds - mov %si,%es - mov $MEM_REL,%di - mov $SIZ_SEC,%cx - rep - movsb - - /* Transfer PC-9801 system common area */ - xor %ax,%ax - mov %ax,%si - mov %ax,%ds - mov %ax,%di - mov $MEM_SYS,%ax - mov %ax,%es - mov $0x0600,%cx - rep - movsb - - /* Transfer EPSON machine type */ - mov $0xfd00,%ax - mov %ax,%ds - mov (0x804),%eax - and $0x00ffffff,%eax - mov %eax,%es:(EPSON_ID) - - /* Set machine type to PC98_SYSTEM_PARAMETER */ -#ifdef SET_MACHINE_TYPE - call set_machine_type -#else - mov $M_NEC_PC98+M_NOT_H98,%eax - mov %eax,%es:(PC98_MACHINE_TYPE) -#endif - - /* Setup graphic screen */ - mov $0x42,%ah /* 640x400 */ - mov $0xc0,%ch - int $0x18 - mov $0x40,%ah /* graph on */ - int $0x18 - - /* Setup text screen */ - mov $0x0a00,%ax /* 80x25 */ - int $0x18 - mov $0x0c,%ah /* text on */ - int $0x18 - mov $0x13,%ah /* cursor home */ - xor %dx,%dx - int $0x18 - mov $0x11,%ah /* cursor on */ - int $0x18 - - /* Setup keyboard */ - mov $0x03,%ah - int $0x18 - - pop %cx - - /* bootstrap passes */ - xor %edi,%edi - mov %di,%ds - mov %di,%es - mov %cs,%bx - cmp $0x1fe0,%bx - jz boot_fd - cmp $0x1fc0,%bx - jnz boot_hd - xor %cx,%cx - mov (DAUA),%al - and $0xf0,%al - cmp $0x30,%al - jz boot_fd - cmp $0x90,%al - jnz boot_hd -boot_fd: xor %cx,%cx - jmp boot_load -boot_hd: test %cx,%cx - jnz boot_load - mov %cs:(boot_cyl),%cx -boot_load: mov %cx,MEM_ARG /* Save cylinder number */ - mov %cx,%di - xor %dx,%dx - mov $LOAD_SIZE,%bx - mov $MEM_BUF,%bp - push %cs - callw read - jc error - - /* Transfer boot2.bin */ - mov $MEM_BTX,%bx - mov 0xa(%bx),%si /* BTX size */ - add %bx,%si /* start of boot2.bin */ - mov $MEM_USR+SIZ_PAG*2,%di - mov $MEM_BTX+(NSECT-1)*SIZ_SEC,%cx - sub %si,%cx - rep - movsb - - /* Enable A20 */ - xor %ax,%ax - outb %al,$0xf2 - mov $0x02,%al - outb %al,$0xf6 - - /* Start BTX */ - ljmp $0x0000,$MEM_JMP - -/* - * Reads sectors from the disk. - * Call with: - * - * %bx - bytes to read - * %cx - cylinder - * %dh - head - * %dl - sector - * %edi - lba - * %es:(%bp) - buffer to read data into - */ -read: xor %ax,%ax - mov %ax,%ds - mov $0x06,%ah - mov (DAUA),%al - mov %ax,%si - and $0xf0,%al - cmp $0x30,%al /* 1.44MB FDD */ - jz read_fd - cmp $0x90,%al /* 1MB FDD */ - jz read_fd - cmp $0xa0,%al /* Is SCSI device? */ - jnz read_load - push %cx - mov %si,%cx - and $0x0f,%cl - inc %cl - mov (0x482),%ah - shr %cl,%ah /* Is SCSI HDD? */ - pop %cx - jc read_load - and $0xff7f,%si /* SCSI MO */ - mov %di,%cx - shr $16,%edi - mov %di,%dx - jmp read_load -read_fd: or $0xd000,%si - or $0x0200,%cx - inc %dx -read_load: mov %si,%ax - int $0x1b - lret - -/* - * Print out the error message, wait for a keypress, and then reboot - * the machine. - */ -error: push %cs - pop %ds - mov $msg_eread,%si - call putstr - xor %ax,%ax /* Get keypress */ - int $0x18 - xor %ax,%ax /* CPU reset */ - outb %al,$0xf0 -halt: hlt - jmp halt /* Spin */ - -/* - * Display a null-terminated string. - */ -putstr.0: push %cs - callw putc -putstr: lodsb - test %al,%al - jne putstr.0 - ret - -/* - * Display a single char. - */ -putc: pusha - xor %dx,%dx - mov %dx,%ds - mov MEM_REL+cursor-start,%di - mov $0xa000,%bx - mov %bx,%es - mov $(80*2),%cx - - cmp $0x08,%al - je putc.bs - cmp $0x0d,%al - je putc.cr - cmp $0x0a,%al - je putc.lf - cmp $0x5c,%al /* \ */ - jne 1f - mov $0xfc,%al -1: movb $0xe1,%es:0x2000(%di) - stosw - jmp putc.scr -putc.bs: test %di,%di - jz putc.move - dec %di - dec %di - movb $0xe1,%es:0x2000(%di) - movw $0x20,%es:(%di) - jmp putc.move -putc.cr: mov %di,%ax - div %cx - sub %dx,%di - jmp putc.move -putc.lf: add %cx,%di -putc.scr: cmp $(80*2*25),%di /* Scroll screen */ - jb putc.move - push %ds - mov %bx,%ds - mov $(80*2),%si - xor %di,%di - mov $(80*24/2),%cx - rep - movsl - xor %ax,%ax - mov $0x20,%al - mov $80,%cl - rep - stosw - pop %ds - mov $(80*24*2),%di -putc.move: mov %di,MEM_REL+cursor-start /* Move cursor */ - mov $0x13,%ah - mov %di,%dx - int $0x18 - popa - lret - -cursor: .word 0 - -#ifdef SET_MACHINE_TYPE -/* - * Set machine type to PC98_SYSTEM_PARAMETER. - */ -set_machine_type: - xor %edx,%edx - mov %dx,%ds -// mov $MEM_SYS,%ax -// mov %ax,%es - - /* Wait V-SYNC */ -vsync.1: inb $0x60,%al - test $0x20,%al - jnz vsync.1 -vsync.2: inb $0x60,%al - test $0x20,%al - jz vsync.2 - - /* ANK 'A' font */ - xor %al,%al - outb %al,$0xa1 - mov $0x41,%al - outb %al,$0xa3 - - /* Get 'A' font from CG window */ - push %ds - mov $0xa400,%ax - mov %ax,%ds - xor %eax,%eax - xor %bx,%bx - mov $4,%cx -font.1: add (%bx),%eax - add $4,%bx - loop font.1 - pop %ds - cmp $0x6efc58fc,%eax - jnz m_epson - -m_pc98: or $M_NEC_PC98,%edx - mov $0x0458,%bx - mov (%bx),%al - test $0x80,%al - jz m_not_h98 - or $M_H98,%edx - jmp 1f -m_epson: or $M_EPSON_PC98,%edx -m_not_h98: or $M_NOT_H98,%edx - -1: inb $0x42,%al - test $0x20,%al - jz 1f - or $M_8M,%edx - -1: mov $0x0400,%bx - mov (%bx),%al - test $0x80,%al - jz 1f - or $M_NOTE,%edx - -1: mov $PC98_MACHINE_TYPE,%bx - mov %edx,%es:(%bx) - ret -#endif - -/* Messages */ - -msg_eread: .asciz "Error\r\n" - - .org PRT_OFF,0x90 - -/* Partition table */ - - .fill 0x30,0x1,0x0 - .byte 0x80, 0x00, 0x01, 0x00 - .byte 0xa5, 0xff, 0xff, 0xff - .byte 0x00, 0x00, 0x00, 0x00 - .byte 0x50, 0xc3, 0x00, 0x00 - - .word 0xaa55 # Magic number diff --git a/sys/boot/pc98/boot2/boot2.c b/sys/boot/pc98/boot2/boot2.c deleted file mode 100644 index b5825168d84e..000000000000 --- a/sys/boot/pc98/boot2/boot2.c +++ /dev/null @@ -1,803 +0,0 @@ -/*- - * Copyright (c) 2008-2009 TAKAHASHI Yoshihiro - * Copyright (c) 1998 Robert Nordier - * All rights reserved. - * - * Redistribution and use in source and binary forms are freely - * permitted provided that the above copyright notice and this - * paragraph and the following disclaimer are duplicated in all - * such forms. - * - * This software is provided "AS IS" and without any express or - * implied warranties, including, without limitation, the implied - * warranties of merchantability and fitness for a particular - * purpose. - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#include <sys/param.h> -#include <sys/disklabel.h> -#include <sys/diskpc98.h> -#include <sys/dirent.h> -#include <sys/reboot.h> - -#include <machine/bootinfo.h> -#include <machine/cpufunc.h> -#include <machine/elf.h> - -#include <stdarg.h> - -#include <a.out.h> - -#include <btxv86.h> - -#include "boot2.h" -#include "lib.h" -#include "paths.h" -#include "rbx.h" - -/* Define to 0 to omit serial support */ -#ifndef SERIAL -#define SERIAL 0 -#endif - -#define IO_KEYBOARD 1 -#define IO_SERIAL 2 - -#if SERIAL -#define DO_KBD (ioctrl & IO_KEYBOARD) -#define DO_SIO (ioctrl & IO_SERIAL) -#else -#define DO_KBD (1) -#define DO_SIO (0) -#endif - -#define SECOND 1 /* Circa that many ticks in a second. */ - -#define ARGS 0x900 -#define NOPT 14 -#define NDEV 3 - -#define DRV_DISK 0xf0 -#define DRV_UNIT 0x0f - -#define TYPE_AD 0 -#define TYPE_DA 1 -#define TYPE_FD 2 - -extern uint32_t _end; - -static const char optstr[NOPT] = "DhaCcdgmnpqrsv"; /* Also 'P', 'S' */ -static const unsigned char flags[NOPT] = { - RBX_DUAL, - RBX_SERIAL, - RBX_ASKNAME, - RBX_CDROM, - RBX_CONFIG, - RBX_KDB, - RBX_GDB, - RBX_MUTE, - RBX_NOINTR, - RBX_PAUSE, - RBX_QUIET, - RBX_DFLTROOT, - RBX_SINGLE, - RBX_VERBOSE -}; - -static const char *const dev_nm[NDEV] = {"ad", "da", "fd"}; -static const unsigned char dev_maj[NDEV] = {30, 4, 2}; -static const unsigned char dev_daua[NDEV] = {0x80, 0xa0, 0x90}; - -static struct dsk { - unsigned daua; - unsigned type; - unsigned disk; - unsigned unit; - unsigned head; - unsigned sec; - uint8_t slice; - uint8_t part; - unsigned start; -} dsk; -static char cmd[512], cmddup[512], knamebuf[1024]; -static const char *kname; -uint32_t opts; -static struct bootinfo bootinfo; -#if SERIAL -static int comspeed = SIOSPD; -static uint8_t ioctrl = IO_KEYBOARD; -#endif - -int main(void); -void exit(int); -static void load(void); -static int parse(void); -static int dskread(void *, unsigned, unsigned); -static void printf(const char *,...); -static void putchar(int); -static int drvread(void *, unsigned); -static int keyhit(unsigned); -static int xputc(int); -static int xgetc(int); -static inline int getc(int); - -static void memcpy(void *, const void *, int); -static void -memcpy(void *dst, const void *src, int len) -{ - const char *s = src; - char *d = dst; - - while (len--) - *d++ = *s++; -} - -static inline int -strcmp(const char *s1, const char *s2) -{ - for (; *s1 == *s2 && *s1; s1++, s2++); - return (unsigned char)*s1 - (unsigned char)*s2; -} - -#define UFS_SMALL_CGBASE -#include "ufsread.c" - -static inline int -xfsread(ufs_ino_t inode, void *buf, size_t nbyte) -{ - if ((size_t)fsread(inode, buf, nbyte) != nbyte) { - printf("Invalid %s\n", "format"); - return -1; - } - return 0; -} - -static inline void -getstr(void) -{ - char *s; - int c; - - s = cmd; - for (;;) { - switch (c = xgetc(0)) { - case 0: - break; - case '\177': - case '\b': - if (s > cmd) { - s--; - printf("\b \b"); - } - break; - case '\n': - case '\r': - *s = 0; - return; - default: - if (s - cmd < sizeof(cmd) - 1) - *s++ = c; - putchar(c); - } - } -} - -static inline void -putc(int c) -{ - - v86.ctl = V86_ADDR | V86_CALLF | V86_FLAGS; - v86.addr = PUTCORG; /* call to putc in boot1 */ - v86.eax = c; - v86int(); - v86.ctl = V86_FLAGS; -} - -static inline int -is_scsi_hd(void) -{ - - if ((*(u_char *)PTOV(0x482) >> dsk.unit) & 0x01) - return 1; - - return 0; -} - -static inline void -fix_sector_size(void) -{ - u_char *p; - - p = (u_char *)PTOV(0x460 + dsk.unit * 4); /* SCSI equipment parameter */ - - if ((p[0] & 0x1f) == 7) { /* SCSI MO */ - if (!(p[3] & 0x30)) { /* 256B / sector */ - p[3] |= 0x10; /* forced set 512B / sector */ - p[3 + 0xa1000] |= 0x10; - } - } -} - -static inline uint32_t -get_diskinfo(void) -{ - - if (dsk.disk == 0x30) { /* 1440KB FD */ - /* 80 cylinders, 2 heads, 18 sectors */ - return (80 << 16) | (2 << 8) | 18; - } else if (dsk.disk == 0x90) { /* 1200KB FD */ - /* 80 cylinders, 2 heads, 15 sectors */ - return (80 << 16) | (2 << 8) | 15; - } else if (dsk.disk == 0x80 || is_scsi_hd()) { /* IDE or SCSI HDD */ - v86.addr = 0x1b; - v86.eax = 0x8400 | dsk.daua; - v86int(); - return (v86.ecx << 16) | v86.edx; - } - - /* SCSI MO or CD */ - fix_sector_size(); /* SCSI MO */ - - /* other SCSI devices */ - return (65535 << 16) | (8 << 8) | 32; -} - -static void -set_dsk(void) -{ - uint32_t di; - - di = get_diskinfo(); - - dsk.head = (di >> 8) & 0xff; - dsk.sec = di & 0xff; - dsk.start = 0; -} - -#ifdef GET_BIOSGEOM -static uint32_t -bd_getbigeom(int bunit) -{ - int hds = 0; - int unit = 0x80; /* IDE HDD */ - u_int addr = 0x55d; - - while (unit < 0xa7) { - if (*(u_char *)PTOV(addr) & (1 << (unit & 0x0f))) - if (hds++ == bunit) - break; - - if (unit >= 0xA0) { - int media = ((unsigned *)PTOV(0x460))[unit & 0x0F] & 0x1F; - - if (media == 7 && hds++ == bunit) /* SCSI MO */ - return(0xFFFE0820); /* C:65535 H:8 S:32 */ - } - if (++unit == 0x84) { - unit = 0xA0; /* SCSI HDD */ - addr = 0x482; - } - } - if (unit == 0xa7) - return 0x4F020F; /* 1200KB FD C:80 H:2 S:15 */ - v86.addr = 0x1b; - v86.eax = 0x8400 | unit; - v86int(); - if (V86_CY(v86.efl)) - return 0x4F020F; /* 1200KB FD C:80 H:2 S:15 */ - return ((v86.ecx & 0xffff) << 16) | (v86.edx & 0xffff); -} -#endif - -static int -check_slice(void) -{ - struct pc98_partition *dp; - char *sec; - unsigned i, cyl; - - sec = dmadat->secbuf; - cyl = *(uint16_t *)PTOV(ARGS); - set_dsk(); - - if (dsk.type == TYPE_FD) - return (WHOLE_DISK_SLICE); - if (drvread(sec, PC98_BBSECTOR)) - return (WHOLE_DISK_SLICE); /* Read error */ - dp = (void *)(sec + PC98_PARTOFF); - for (i = 0; i < PC98_NPARTS; i++) { - if (dp[i].dp_mid == DOSMID_386BSD) { - if (dp[i].dp_scyl <= cyl && cyl <= dp[i].dp_ecyl) - return (BASE_SLICE + i); - } - } - - return (WHOLE_DISK_SLICE); -} - -int -main(void) -{ -#ifdef GET_BIOSGEOM - int i; -#endif - uint8_t autoboot; - ufs_ino_t ino; - size_t nbyte; - - dmadat = (void *)(roundup2(__base + (int32_t)&_end, 0x10000) - __base); - v86.ctl = V86_FLAGS; - v86.efl = PSL_RESERVED_DEFAULT | PSL_I; - dsk.daua = *(uint8_t *)PTOV(0x584); - dsk.disk = dsk.daua & DRV_DISK; - dsk.unit = dsk.daua & DRV_UNIT; - if (dsk.disk == 0x80) - dsk.type = TYPE_AD; - else if (dsk.disk == 0xa0) - dsk.type = TYPE_DA; - else /* if (dsk.disk == 0x30 || dsk.disk == 0x90) */ - dsk.type = TYPE_FD; - dsk.slice = check_slice(); -#ifdef GET_BIOSGEOM - for (i = 0; i < N_BIOS_GEOM; i++) - bootinfo.bi_bios_geom[i] = bd_getbigeom(i); -#endif - bootinfo.bi_version = BOOTINFO_VERSION; - bootinfo.bi_size = sizeof(bootinfo); - - /* Process configuration file */ - - autoboot = 1; - - if ((ino = lookup(PATH_CONFIG)) || - (ino = lookup(PATH_DOTCONFIG))) { - nbyte = fsread(ino, cmd, sizeof(cmd) - 1); - cmd[nbyte] = '\0'; - } - - if (*cmd) { - memcpy(cmddup, cmd, sizeof(cmd)); - if (parse()) - autoboot = 0; - if (!OPT_CHECK(RBX_QUIET)) - printf("%s: %s", PATH_CONFIG, cmddup); - /* Do not process this command twice */ - *cmd = 0; - } - - /* - * Try to exec stage 3 boot loader. If interrupted by a keypress, - * or in case of failure, try to load a kernel directly instead. - */ - - if (!kname) { - kname = PATH_LOADER; - if (autoboot && !keyhit(3*SECOND)) { - load(); - kname = PATH_KERNEL; - } - } - - /* Present the user with the boot2 prompt. */ - - for (;;) { - if (!autoboot || !OPT_CHECK(RBX_QUIET)) - printf("\nFreeBSD/pc98 boot\n" - "Default: %u:%s(%u,%c)%s\n" - "boot: ", - dsk.unit, dev_nm[dsk.type], dsk.unit, - 'a' + dsk.part, kname); - if (DO_SIO) - sio_flush(); - if (!autoboot || keyhit(3*SECOND)) - getstr(); - else if (!autoboot || !OPT_CHECK(RBX_QUIET)) - putchar('\n'); - autoboot = 0; - if (parse()) - putchar('\a'); - else - load(); - } -} - -/* XXX - Needed for btxld to link the boot2 binary; do not remove. */ -void -exit(int x) -{ -} - -static void -load(void) -{ - union { - struct exec ex; - Elf32_Ehdr eh; - } hdr; - static Elf32_Phdr ep[2]; - static Elf32_Shdr es[2]; - caddr_t p; - ufs_ino_t ino; - uint32_t addr; - int k; - uint8_t i, j; - - if (!(ino = lookup(kname))) { - if (!ls) - printf("No %s\n", kname); - return; - } - if (xfsread(ino, &hdr, sizeof(hdr))) - return; - - if (N_GETMAGIC(hdr.ex) == ZMAGIC) { - addr = hdr.ex.a_entry & 0xffffff; - p = PTOV(addr); - fs_off = PAGE_SIZE; - if (xfsread(ino, p, hdr.ex.a_text)) - return; - p += roundup2(hdr.ex.a_text, PAGE_SIZE); - if (xfsread(ino, p, hdr.ex.a_data)) - return; - } else if (IS_ELF(hdr.eh)) { - fs_off = hdr.eh.e_phoff; - for (j = k = 0; k < hdr.eh.e_phnum && j < 2; k++) { - if (xfsread(ino, ep + j, sizeof(ep[0]))) - return; - if (ep[j].p_type == PT_LOAD) - j++; - } - for (i = 0; i < 2; i++) { - p = PTOV(ep[i].p_paddr & 0xffffff); - fs_off = ep[i].p_offset; - if (xfsread(ino, p, ep[i].p_filesz)) - return; - } - p += roundup2(ep[1].p_memsz, PAGE_SIZE); - bootinfo.bi_symtab = VTOP(p); - if (hdr.eh.e_shnum == hdr.eh.e_shstrndx + 3) { - fs_off = hdr.eh.e_shoff + sizeof(es[0]) * - (hdr.eh.e_shstrndx + 1); - if (xfsread(ino, &es, sizeof(es))) - return; - for (i = 0; i < 2; i++) { - *(Elf32_Word *)p = es[i].sh_size; - p += sizeof(es[i].sh_size); - fs_off = es[i].sh_offset; - if (xfsread(ino, p, es[i].sh_size)) - return; - p += es[i].sh_size; - } - } - addr = hdr.eh.e_entry & 0xffffff; - bootinfo.bi_esymtab = VTOP(p); - } else { - printf("Invalid %s\n", "format"); - return; - } - - bootinfo.bi_kernelname = VTOP(kname); - bootinfo.bi_bios_dev = dsk.daua; - __exec((caddr_t)addr, RB_BOOTINFO | (opts & RBX_MASK), - MAKEBOOTDEV(dev_maj[dsk.type], dsk.slice, dsk.unit, dsk.part), - 0, 0, 0, VTOP(&bootinfo)); -} - -static int -parse() -{ - char *arg = cmd; - char *ep, *p, *q; - const char *cp; - unsigned int drv; - int c, i, j; - size_t k; - - while ((c = *arg++)) { - if (c == ' ' || c == '\t' || c == '\n') - continue; - for (p = arg; *p && *p != '\n' && *p != ' ' && *p != '\t'; p++); - ep = p; - if (*p) - *p++ = 0; - if (c == '-') { - while ((c = *arg++)) { - if (c == 'P') { - if (*(uint8_t *)PTOV(0x481) & 0x48) { - cp = "yes"; - } else { - opts |= OPT_SET(RBX_DUAL) | OPT_SET(RBX_SERIAL); - cp = "no"; - } - printf("Keyboard: %s\n", cp); - continue; -#if SERIAL - } else if (c == 'S') { - j = 0; - while ((unsigned int)(i = *arg++ - '0') <= 9) - j = j * 10 + i; - if (j > 0 && i == -'0') { - comspeed = j; - break; - } - /* Fall through to error below ('S' not in optstr[]). */ -#endif - } - for (i = 0; c != optstr[i]; i++) - if (i == NOPT - 1) - return -1; - opts ^= OPT_SET(flags[i]); - } -#if SERIAL - ioctrl = OPT_CHECK(RBX_DUAL) ? (IO_SERIAL|IO_KEYBOARD) : - OPT_CHECK(RBX_SERIAL) ? IO_SERIAL : IO_KEYBOARD; - if (DO_SIO) { - if (sio_init(115200 / comspeed) != 0) - ioctrl &= ~IO_SERIAL; - } -#endif - } else { - for (q = arg--; *q && *q != '('; q++); - if (*q) { - drv = -1; - if (arg[1] == ':') { - drv = *arg - '0'; - if (drv > 9) - return (-1); - arg += 2; - } - if (q - arg != 2) - return -1; - for (i = 0; arg[0] != dev_nm[i][0] || - arg[1] != dev_nm[i][1]; i++) - if (i == NDEV - 1) - return -1; - dsk.type = i; - arg += 3; - dsk.unit = *arg - '0'; - if (arg[1] != ',' || dsk.unit > 9) - return -1; - arg += 2; - dsk.slice = WHOLE_DISK_SLICE; - if (arg[1] == ',') { - dsk.slice = *arg - '0' + 1; - if (dsk.slice > PC98_NPARTS + 1) - return -1; - arg += 2; - } - if (arg[1] != ')') - return -1; - dsk.part = *arg - 'a'; - if (dsk.part > 7) - return (-1); - arg += 2; - if (drv == -1) - drv = dsk.unit; - dsk.disk = dev_daua[dsk.type]; - dsk.daua = dsk.disk | dsk.unit; - dsk_meta = 0; - } - k = ep - arg; - if (k > 0) { - if (k >= sizeof(knamebuf)) - return -1; - memcpy(knamebuf, arg, k + 1); - kname = knamebuf; - } - } - arg = p; - } - return 0; -} - -static int -dskread(void *buf, unsigned lba, unsigned nblk) -{ - struct pc98_partition *dp; - struct disklabel *d; - char *sec; - unsigned i; - uint8_t sl; - u_char *p; - const char *reason; - - if (!dsk_meta) { - sec = dmadat->secbuf; - set_dsk(); - if (dsk.type == TYPE_FD) - goto unsliced; - if (drvread(sec, PC98_BBSECTOR)) - return -1; - dp = (void *)(sec + PC98_PARTOFF); - sl = dsk.slice; - if (sl < BASE_SLICE) { - for (i = 0; i < PC98_NPARTS; i++) - if (dp[i].dp_mid == DOSMID_386BSD) { - sl = BASE_SLICE + i; - break; - } - dsk.slice = sl; - } - if (sl != WHOLE_DISK_SLICE) { - dp += sl - BASE_SLICE; - if (dp->dp_mid != DOSMID_386BSD) { - reason = "slice"; - goto error; - } - dsk.start = dp->dp_scyl * dsk.head * dsk.sec + - dp->dp_shd * dsk.sec + dp->dp_ssect; - } - if (drvread(sec, dsk.start + LABELSECTOR)) - return -1; - d = (void *)(sec + LABELOFFSET); - if (d->d_magic != DISKMAGIC || d->d_magic2 != DISKMAGIC) { - if (dsk.part != RAW_PART) { - reason = "label"; - goto error; - } - } else { - if (dsk.part >= d->d_npartitions || - !d->d_partitions[dsk.part].p_size) { - reason = "partition"; - goto error; - } - dsk.start += d->d_partitions[dsk.part].p_offset; - dsk.start -= d->d_partitions[RAW_PART].p_offset; - } - unsliced: ; - } - for (p = buf; nblk; p += 512, lba++, nblk--) { - if ((i = drvread(p, dsk.start + lba))) - return i; - } - return 0; -error: - printf("Invalid %s\n", reason); - return -1; -} - -static void -printf(const char *fmt,...) -{ - va_list ap; - static char buf[10]; - char *s; - unsigned u; - int c; - - va_start(ap, fmt); - while ((c = *fmt++)) { - if (c == '%') { - c = *fmt++; - switch (c) { - case 'c': - putchar(va_arg(ap, int)); - continue; - case 's': - for (s = va_arg(ap, char *); *s; s++) - putchar(*s); - continue; - case 'u': - u = va_arg(ap, unsigned); - s = buf; - do - *s++ = '0' + u % 10U; - while (u /= 10U); - while (--s >= buf) - putchar(*s); - continue; - } - } - putchar(c); - } - va_end(ap); - return; -} - -static void -putchar(int c) -{ - if (c == '\n') - xputc('\r'); - xputc(c); -} - -static int -drvread(void *buf, unsigned lba) -{ - static unsigned c = 0x2d5c7c2f; - unsigned bpc, x, cyl, head, sec; - - bpc = dsk.sec * dsk.head; - cyl = lba / bpc; - x = lba % bpc; - head = x / dsk.sec; - sec = x % dsk.sec; - - if (!OPT_CHECK(RBX_QUIET)) { - xputc(c = c << 8 | c >> 24); - xputc('\b'); - } - v86.ctl = V86_ADDR | V86_CALLF | V86_FLAGS; - v86.addr = READORG; /* call to read in boot1 */ - v86.ecx = cyl; - v86.edx = (head << 8) | sec; - v86.edi = lba; - v86.ebx = 512; - v86.es = VTOPSEG(buf); - v86.ebp = VTOPOFF(buf); - v86int(); - v86.ctl = V86_FLAGS; - if (V86_CY(v86.efl)) { - printf("error %u c/h/s %u/%u/%u lba %u\n", v86.eax >> 8 & 0xff, - cyl, head, sec, lba); - return -1; - } - return 0; -} - -static inline void -delay(void) -{ - int i; - - i = 800; - do { - outb(0x5f, 0); /* about 600ns */ - } while (--i >= 0); -} - -static int -keyhit(unsigned sec) -{ - unsigned i; - - if (OPT_CHECK(RBX_NOINTR)) - return 0; - for (i = 0; i < sec * 1000; i++) { - if (xgetc(1)) - return 1; - delay(); - } - return 0; -} - -static int -xputc(int c) -{ - if (DO_KBD) - putc(c); - if (DO_SIO) - sio_putc(c); - return c; -} - -static int -getc(int fn) -{ - v86.addr = 0x18; - v86.eax = fn << 8; - v86int(); - if (fn) - return (v86.ebx >> 8) & 0x01; - else - return v86.eax & 0xff; -} - -static int -xgetc(int fn) -{ - if (OPT_CHECK(RBX_NOINTR)) - return 0; - for (;;) { - if (DO_KBD && getc(1)) - return fn ? 1 : getc(0); - if (DO_SIO && sio_ischar()) - return fn ? 1 : sio_getc(); - if (fn) - return 0; - } -} diff --git a/sys/boot/pc98/btx/Makefile b/sys/boot/pc98/btx/Makefile deleted file mode 100644 index 39f78ed639b9..000000000000 --- a/sys/boot/pc98/btx/Makefile +++ /dev/null @@ -1,5 +0,0 @@ -# $FreeBSD$ - -SUBDIR= btx btxldr lib - -.include <bsd.subdir.mk> diff --git a/sys/boot/pc98/btx/Makefile.inc b/sys/boot/pc98/btx/Makefile.inc deleted file mode 100644 index 265f86d1ed55..000000000000 --- a/sys/boot/pc98/btx/Makefile.inc +++ /dev/null @@ -1,3 +0,0 @@ -# $FreeBSD$ - -.include "../Makefile.inc" diff --git a/sys/boot/pc98/btx/btx/Makefile b/sys/boot/pc98/btx/btx/Makefile deleted file mode 100644 index 275546068286..000000000000 --- a/sys/boot/pc98/btx/btx/Makefile +++ /dev/null @@ -1,33 +0,0 @@ -# $FreeBSD$ - -PROG= btx -INTERNALPROG= -MAN= -SRCS= btx.S - -.if defined(BOOT_BTX_NOHANG) -BOOT_BTX_FLAGS=0x1 -.else -BOOT_BTX_FLAGS=0x0 -.endif - -CFLAGS+=-DBTX_FLAGS=${BOOT_BTX_FLAGS} -CFLAGS+=-I${.CURDIR}/../../../i386/common - -.if defined(BTX_SERIAL) -BOOT_COMCONSOLE_PORT?= 0x238 -BOOT_COMCONSOLE_SPEED?= 9600 -B2SIOFMT?= 0x3 - -CFLAGS+=-DBTX_SERIAL -DSIOPRT=${BOOT_COMCONSOLE_PORT} \ - -DSIOFMT=${B2SIOFMT} -DSIOSPD=${BOOT_COMCONSOLE_SPEED} -.endif - -ORG= 0x9000 - -LDFLAGS=${LDFLAGS_BIN} - -.include <bsd.prog.mk> - -# XXX: clang integrated-as doesn't grok .codeNN directives yet -CFLAGS.btx.S= ${CLANG_NO_IAS} diff --git a/sys/boot/pc98/btx/btx/btx.S b/sys/boot/pc98/btx/btx/btx.S deleted file mode 100644 index e8710d38584a..000000000000 --- a/sys/boot/pc98/btx/btx/btx.S +++ /dev/null @@ -1,1104 +0,0 @@ -/* - * Copyright (c) 1998 Robert Nordier - * All rights reserved. - * - * Redistribution and use in source and binary forms are freely - * permitted provided that the above copyright notice and this - * paragraph and the following disclaimer are duplicated in all - * such forms. - * - * This software is provided "AS IS" and without any express or - * implied warranties, including, without limitation, the implied - * warranties of merchantability and fitness for a particular - * purpose. - * - * $FreeBSD$ - */ - -#include <bootargs.h> - -/* - * Memory layout. - */ - .set MEM_BTX,0x1000 # Start of BTX memory - .set MEM_ESP0,0x1800 # Supervisor stack - .set MEM_BUF,0x1800 # Scratch buffer - .set MEM_ESPR,0x5e00 # Real mode stack - .set MEM_IDT,0x5e00 # IDT - .set MEM_TSS,0x5f98 # TSS - .set MEM_MAP,0x6000 # I/O bit map - .set MEM_TSS_END,0x7fff # End of TSS - .set MEM_ORG,0x9000 # BTX code - .set MEM_USR,0xa000 # Start of user memory -/* - * Paging control. - */ - .set PAG_SIZ,0x1000 # Page size - .set PAG_CNT,0x1000 # Pages to map -/* - * Fields in %eflags. - */ - .set PSL_RESERVED_DEFAULT,0x00000002 - .set PSL_T,0x00000100 # Trap flag - .set PSL_I,0x00000200 # Interrupt enable flag - .set PSL_VM,0x00020000 # Virtual 8086 mode flag - .set PSL_AC,0x00040000 # Alignment check flag -/* - * Segment selectors. - */ - .set SEL_SCODE,0x8 # Supervisor code - .set SEL_SDATA,0x10 # Supervisor data - .set SEL_RCODE,0x18 # Real mode code - .set SEL_RDATA,0x20 # Real mode data - .set SEL_UCODE,0x28|3 # User code - .set SEL_UDATA,0x30|3 # User data - .set SEL_TSS,0x38 # TSS -/* - * Task state segment fields. - */ - .set TSS_ESP0,0x4 # PL 0 ESP - .set TSS_SS0,0x8 # PL 0 SS - .set TSS_MAP,0x66 # I/O bit map base -/* - * System calls. - */ - .set SYS_EXIT,0x0 # Exit - .set SYS_EXEC,0x1 # Exec -/* - * Fields in V86 interface structure. - */ - .set V86_CTL,0x0 # Control flags - .set V86_ADDR,0x4 # Int number/address - .set V86_ES,0x8 # V86 ES - .set V86_DS,0xc # V86 DS - .set V86_FS,0x10 # V86 FS - .set V86_GS,0x14 # V86 GS -/* - * V86 control flags. - */ - .set V86F_ADDR,0x10000 # Segment:offset address - .set V86F_CALLF,0x20000 # Emulate far call - .set V86F_FLAGS,0x40000 # Return flags -/* - * Dump format control bytes. - */ - .set DMP_X16,0x1 # Word - .set DMP_X32,0x2 # Long - .set DMP_MEM,0x4 # Memory - .set DMP_EOL,0x8 # End of line -/* - * Screen defaults and assumptions. - */ - .set SCR_MAT,0xe1 # Mode/attribute - .set SCR_COL,0x50 # Columns per row - .set SCR_ROW,0x19 # Rows per screen -/* - * BIOS Data Area locations. - */ - .set BDA_MEM,0x501 # Free memory - .set BDA_POS,0x53e # Cursor position -/* - * Derivations, for brevity. - */ - .set _ESP0H,MEM_ESP0>>0x8 # Byte 1 of ESP0 - .set _TSSIO,MEM_MAP-MEM_TSS # TSS I/O base - .set _TSSLM,MEM_TSS_END-MEM_TSS # TSS limit - .set _IDTLM,MEM_TSS-MEM_IDT-1 # IDT limit -/* - * Code segment. - */ - .globl start - .code16 -start: # Start of code -/* - * BTX header. - */ -btx_hdr: .byte 0xeb # Machine ID - .byte 0xe # Header size - .ascii "BTX" # Magic - .byte 0x1 # Major version - .byte 0x2 # Minor version - .byte BTX_FLAGS # Flags - .word PAG_CNT-MEM_ORG>>0xc # Paging control - .word break-start # Text size - .long 0x0 # Entry address -/* - * Initialization routine. - */ -init: cli # Disable interrupts - xor %ax,%ax # Zero/segment - mov %ax,%ss # Set up - mov $MEM_ESP0,%sp # stack - mov %ax,%es # Address - mov %ax,%ds # data - pushl $0x2 # Clear - popfl # flags -/* - * Initialize memory. - */ - mov $MEM_IDT,%di # Memory to initialize - mov $(MEM_ORG-MEM_IDT)/2,%cx # Words to zero - rep # Zero-fill - stosw # memory -/* - * Update real mode IDT for reflecting hardware interrupts. - */ - mov $intr20,%bx # Address first handler - mov $0x10,%cx # Number of handlers - mov $0x20*4,%di # First real mode IDT entry -init.0: mov %bx,(%di) # Store IP - inc %di # Address next - inc %di # entry - stosw # Store CS - add $4,%bx # Next handler - loop init.0 # Next IRQ -/* - * Create IDT. - */ - mov $MEM_IDT,%di - mov $idtctl,%si # Control string -init.1: lodsb # Get entry - cbw # count - xchg %ax,%cx # as word - jcxz init.4 # If done - lodsb # Get segment - xchg %ax,%dx # P:DPL:type - lodsw # Get control - xchg %ax,%bx # set - lodsw # Get handler offset - mov $SEL_SCODE,%dh # Segment selector -init.2: shr %bx # Handle this int? - jnc init.3 # No - mov %ax,(%di) # Set handler offset - mov %dh,0x2(%di) # and selector - mov %dl,0x5(%di) # Set P:DPL:type - add $0x4,%ax # Next handler -init.3: lea 0x8(%di),%di # Next entry - loop init.2 # Till set done - jmp init.1 # Continue -/* - * Initialize TSS. - */ -init.4: movb $_ESP0H,TSS_ESP0+1(%di) # Set ESP0 - movb $SEL_SDATA,TSS_SS0(%di) # Set SS0 - movb $_TSSIO,TSS_MAP(%di) # Set I/O bit map base -/* - * Bring up the system. - */ - mov $0x2820,%bx # Set protected mode - callw setpic # IRQ offsets - lidt idtdesc # Set IDT - lgdt gdtdesc # Set GDT - mov %cr0,%eax # Switch to protected - inc %ax # mode - mov %eax,%cr0 # - ljmp $SEL_SCODE,$init.8 # To 32-bit code - .code32 -init.8: xorl %ecx,%ecx # Zero - movb $SEL_SDATA,%cl # To 32-bit - movw %cx,%ss # stack -/* - * Launch user task. - */ - movb $SEL_TSS,%cl # Set task - ltr %cx # register - movl $MEM_USR,%edx # User base address - movzwl %ss:BDA_MEM,%eax # Get free memory - andl $0x7,%eax - incl %eax - shll $0x11,%eax # To bytes - subl $ARGSPACE,%eax # Less arg space - subl %edx,%eax # Less base - movb $SEL_UDATA,%cl # User data selector - pushl %ecx # Set SS - pushl %eax # Set ESP - push $0x202 # Set flags (IF set) - push $SEL_UCODE # Set CS - pushl btx_hdr+0xc # Set EIP - pushl %ecx # Set GS - pushl %ecx # Set FS - pushl %ecx # Set DS - pushl %ecx # Set ES - pushl %edx # Set EAX - movb $0x7,%cl # Set remaining -init.9: push $0x0 # general - loop init.9 # registers -#ifdef BTX_SERIAL - call sio_init # setup the serial console -#endif - popa # and initialize - popl %es # Initialize - popl %ds # user - popl %fs # segment - popl %gs # registers - iret # To user mode -/* - * Exit routine. - */ -exit: cli # Disable interrupts - movl $MEM_ESP0,%esp # Clear stack -/* - * Turn off paging. - */ - movl %cr0,%eax # Get CR0 - andl $~0x80000000,%eax # Disable - movl %eax,%cr0 # paging - xorl %ecx,%ecx # Zero - movl %ecx,%cr3 # Flush TLB -/* - * Restore the GDT in case we caught a kernel trap. - */ - lgdt %cs:gdtdesc # Set GDT -/* - * To 16 bits. - */ - ljmpw $SEL_RCODE,$exit.1 # Reload CS - .code16 -exit.1: mov $SEL_RDATA,%cl # 16-bit selector - mov %cx,%ss # Reload SS - mov %cx,%ds # Load - mov %cx,%es # remaining - mov %cx,%fs # segment - mov %cx,%gs # registers -/* - * To real-address mode. - */ - dec %ax # Switch to - mov %eax,%cr0 # real mode - ljmp $0x0,$exit.2 # Reload CS -exit.2: xor %ax,%ax # Real mode segment - mov %ax,%ss # Reload SS - mov %ax,%ds # Address data - mov $0x1008,%bx # Set real mode - callw setpic # IRQ offsets - lidt ivtdesc # Set IVT -/* - * Reboot or await reset. - */ - sti # Enable interrupts - testb $0x1,btx_hdr+0x7 # Reboot? -exit.3: jz exit.3 # No - movb $0xa0,%al - outb %al,$0x35 - movb $0x00,%al - outb %al,$0xf0 # reboot the machine -exit.4: jmp exit.4 -/* - * Set IRQ offsets by reprogramming 8259A PICs. - */ -setpic: in $0x02,%al # Save master - push %ax # IMR - in $0x0a,%al # Save slave - push %ax # IMR - movb $0x11,%al # ICW1 to - outb %al,$0x00 # master, - outb %al,$0x08 # slave - movb %bl,%al # ICW2 to - outb %al,$0x02 # master - movb %bh,%al # ICW2 to - outb %al,$0x0a # slave - movb $0x80,%al # ICW3 to - outb %al,$0x02 # master - movb $0x7,%al # ICW3 to - outb %al,$0x0a # slave - movb $0x1d,%al # ICW4 to - outb %al,$0x02 # master, - movb $0x9,%al # ICW4 to - outb %al,$0x0a # slave - pop %ax # Restore slave - outb %al,$0x0a # IMR - pop %ax # Restore master - outb %al,$0x02 # IMR - retw # To caller - .code32 -/* - * Exception jump table. - */ -intx00: push $0x0 # Int 0x0: #DE - jmp ex_noc # Divide error - push $0x1 # Int 0x1: #DB - jmp ex_noc # Debug - push $0x3 # Int 0x3: #BP - jmp ex_noc # Breakpoint - push $0x4 # Int 0x4: #OF - jmp ex_noc # Overflow - push $0x5 # Int 0x5: #BR - jmp ex_noc # BOUND range exceeded - push $0x6 # Int 0x6: #UD - jmp ex_noc # Invalid opcode - push $0x7 # Int 0x7: #NM - jmp ex_noc # Device not available - push $0x8 # Int 0x8: #DF - jmp except # Double fault - push $0xa # Int 0xa: #TS - jmp except # Invalid TSS - push $0xb # Int 0xb: #NP - jmp except # Segment not present - push $0xc # Int 0xc: #SS - jmp except # Stack segment fault - push $0xd # Int 0xd: #GP - jmp except # General protection - push $0xe # Int 0xe: #PF - jmp except # Page fault -intx10: push $0x10 # Int 0x10: #MF - jmp ex_noc # Floating-point error -/* - * Save a zero error code. - */ -ex_noc: pushl (%esp,1) # Duplicate int no - movb $0x0,0x4(%esp,1) # Fake error code -/* - * Handle exception. - */ -except: cld # String ops inc - pushl %ds # Save - pushl %es # most - pusha # registers - pushl %gs # Set GS - pushl %fs # Set FS - pushl %ds # Set DS - pushl %es # Set ES - cmpw $SEL_SCODE,0x44(%esp,1) # Supervisor mode? - jne except.1 # No - pushl %ss # Set SS - jmp except.2 # Join common code -except.1: pushl 0x50(%esp,1) # Set SS -except.2: pushl 0x50(%esp,1) # Set ESP - push $SEL_SDATA # Set up - popl %ds # to - pushl %ds # address - popl %es # data - movl %esp,%ebx # Stack frame - movl $dmpfmt,%esi # Dump format string - movl $MEM_BUF,%edi # Buffer - pushl %eax - pushl %edx -wait.1: inb $0x60,%al - testb $0x04,%al - jz wait.1 - movb $0xe0,%al - outb %al,$0x62 -wait.2: inb $0x60,%al - testb $0x01,%al - jz wait.2 - xorl %edx,%edx - inb $0x62,%al - movb %al,%dl - inb $0x62,%al - movb %al,%dh - inb $0x62,%al - inb $0x62,%al - inb $0x62,%al - movl %edx,%eax - shlw $1,%ax - movl $BDA_POS,%edx - movw %ax,(%edx) - popl %edx - popl %eax - pushl %edi # Dump to - call dump # buffer - popl %esi # and - call putstr # display - leal 0x18(%esp,1),%esp # Discard frame - popa # Restore - popl %es # registers - popl %ds # saved - cmpb $0x3,(%esp,1) # Breakpoint? - je except.3 # Yes - cmpb $0x1,(%esp,1) # Debug? - jne except.2a # No - testl $PSL_T,0x10(%esp,1) # Trap flag set? - jnz except.3 # Yes -except.2a: jmp exit # Exit -except.3: leal 0x8(%esp,1),%esp # Discard err, int no - iret # From interrupt - -/* - * Reboot the machine by setting the reboot flag and exiting - */ -reboot: orb $0x1,btx_hdr+0x7 # Set the reboot flag - jmp exit # Terminate BTX and reboot - -/* - * Protected Mode Hardware interrupt jump table. - */ -intx20: push $0x8 # Int 0x20: IRQ0 - jmp int_hw # V86 int 0x8 - push $0x9 # Int 0x21: IRQ1 - jmp int_hw # V86 int 0x9 - push $0xa # Int 0x22: IRQ2 - jmp int_hw # V86 int 0xa - push $0xb # Int 0x23: IRQ3 - jmp int_hw # V86 int 0xb - push $0xc # Int 0x24: IRQ4 - jmp int_hw # V86 int 0xc - push $0xd # Int 0x25: IRQ5 - jmp int_hw # V86 int 0xd - push $0xe # Int 0x26: IRQ6 - jmp int_hw # V86 int 0xe - push $0xf # Int 0x27: IRQ7 - jmp int_hw # V86 int 0xf - push $0x10 # Int 0x28: IRQ8 - jmp int_hw # V86 int 0x10 - push $0x11 # Int 0x29: IRQ9 - jmp int_hw # V86 int 0x11 - push $0x12 # Int 0x2a: IRQ10 - jmp int_hw # V86 int 0x12 - push $0x13 # Int 0x2b: IRQ11 - jmp int_hw # V86 int 0x13 - push $0x14 # Int 0x2c: IRQ12 - jmp int_hw # V86 int 0x14 - push $0x15 # Int 0x2d: IRQ13 - jmp int_hw # V86 int 0x15 - push $0x16 # Int 0x2e: IRQ14 - jmp int_hw # V86 int 0x16 - push $0x17 # Int 0x2f: IRQ15 - jmp int_hw # V86 int 0x17 - -/* - * Invoke real mode interrupt/function call from user mode with arguments. - */ -intx31: pushl $-1 # Dummy int no for btx_v86 -/* - * Invoke real mode interrupt/function call from protected mode. - * - * We place a trampoline on the user stack that will return to rret_tramp - * which will reenter protected mode and then finally return to the user - * client. - * - * Kernel frame %esi points to: Real mode stack frame at MEM_ESPR: - * - * -0x00 user %ss -0x04 kernel %esp (with full frame) - * -0x04 user %esp -0x08 btx_v86 pointer - * -0x08 user %eflags -0x0c flags (only used if interrupt) - * -0x0c user %cs -0x10 real mode CS:IP return trampoline - * -0x10 user %eip -0x12 real mode flags - * -0x14 int no -0x16 real mode CS:IP (target) - * -0x18 %eax - * -0x1c %ecx - * -0x20 %edx - * -0x24 %ebx - * -0x28 %esp - * -0x2c %ebp - * -0x30 %esi - * -0x34 %edi - * -0x38 %gs - * -0x3c %fs - * -0x40 %ds - * -0x44 %es - * -0x48 zero %eax (hardware int only) - * -0x4c zero %ecx (hardware int only) - * -0x50 zero %edx (hardware int only) - * -0x54 zero %ebx (hardware int only) - * -0x58 zero %esp (hardware int only) - * -0x5c zero %ebp (hardware int only) - * -0x60 zero %esi (hardware int only) - * -0x64 zero %edi (hardware int only) - * -0x68 zero %gs (hardware int only) - * -0x6c zero %fs (hardware int only) - * -0x70 zero %ds (hardware int only) - * -0x74 zero %es (hardware int only) - */ -int_hw: cld # String ops inc - pusha # Save gp regs - pushl %gs # Save - pushl %fs # seg - pushl %ds # regs - pushl %es - push $SEL_SDATA # Set up - popl %ds # to - pushl %ds # address - popl %es # data - leal 0x44(%esp,1),%esi # Base of frame - movl %esp,MEM_ESPR-0x04 # Save kernel stack pointer - movl -0x14(%esi),%eax # Get Int no - cmpl $-1,%eax # Hardware interrupt? - jne intusr.1 # Yes -/* - * v86 calls save the btx_v86 pointer on the real mode stack and read - * the address and flags from the btx_v86 structure. For interrupt - * handler invocations (VM86 INTx requests), disable interrupts, - * tracing, and alignment checking while the handler runs. - */ - movl $MEM_USR,%ebx # User base - movl %ebx,%edx # address - addl -0x4(%esi),%ebx # User ESP - movl (%ebx),%ebp # btx_v86 pointer - addl %ebp,%edx # Flatten btx_v86 ptr - movl %edx,MEM_ESPR-0x08 # Save btx_v86 ptr - movl V86_ADDR(%edx),%eax # Get int no/address - movl V86_CTL(%edx),%edx # Get control flags - movl -0x08(%esi),%ebx # Save user flags in %ebx - testl $V86F_ADDR,%edx # Segment:offset? - jnz intusr.4 # Yes - andl $~(PSL_I|PSL_T|PSL_AC),%ebx # Disable interrupts, tracing, - # and alignment checking for - # interrupt handler - jmp intusr.3 # Skip hardware interrupt -/* - * Hardware interrupts store a NULL btx_v86 pointer and use the - * address (interrupt number) from the stack with empty flags. Also, - * push a dummy frame of zeros onto the stack for all the general - * purpose and segment registers and clear %eflags. This gives the - * hardware interrupt handler a clean slate. - */ -intusr.1: xorl %edx,%edx # Control flags - movl %edx,MEM_ESPR-0x08 # NULL btx_v86 ptr - movl $12,%ecx # Frame is 12 dwords -intusr.2: pushl $0x0 # Fill frame - loop intusr.2 # with zeros - movl $PSL_RESERVED_DEFAULT,%ebx # Set clean %eflags -/* - * Look up real mode IDT entry for hardware interrupts and VM86 INTx - * requests. - */ -intusr.3: shll $0x2,%eax # Scale - movl (%eax),%eax # Load int vector - jmp intusr.5 # Skip CALLF test -/* - * Panic if V86F_CALLF isn't set with V86F_ADDR. - */ -intusr.4: testl $V86F_CALLF,%edx # Far call? - jnz intusr.5 # Ok - movl %edx,0x30(%esp,1) # Place VM86 flags in int no - movl $badvm86,%esi # Display bad - call putstr # VM86 call - popl %es # Restore - popl %ds # seg - popl %fs # regs - popl %gs - popal # Restore gp regs - jmp ex_noc # Panic -/* - * %eax now holds the segment:offset of the function. - * %ebx now holds the %eflags to pass to real mode. - * %edx now holds the V86F_* flags. - */ -intusr.5: movw %bx,MEM_ESPR-0x12 # Pass user flags to real mode - # target -/* - * If this is a v86 call, copy the seg regs out of the btx_v86 structure. - */ - movl MEM_ESPR-0x08,%ecx # Get btx_v86 ptr - jecxz intusr.6 # Skip for hardware ints - leal -0x44(%esi),%edi # %edi => kernel stack seg regs - pushl %esi # Save - leal V86_ES(%ecx),%esi # %esi => btx_v86 seg regs - movl $4,%ecx # Copy seg regs - rep # from btx_v86 - movsl # to kernel stack - popl %esi # Restore -intusr.6: movl -0x08(%esi),%ebx # Copy user flags to real - movl %ebx,MEM_ESPR-0x0c # mode return trampoline - movl $rret_tramp,%ebx # Set return trampoline - movl %ebx,MEM_ESPR-0x10 # CS:IP - movl %eax,MEM_ESPR-0x16 # Real mode target CS:IP - ljmpw $SEL_RCODE,$intusr.7 # Change to 16-bit segment - .code16 -intusr.7: movl %cr0,%eax # Leave - dec %al # protected - movl %eax,%cr0 # mode - ljmpw $0x0,$intusr.8 -intusr.8: xorw %ax,%ax # Reset %ds - movw %ax,%ds # and - movw %ax,%ss # %ss - lidt ivtdesc # Set IVT - popl %es # Restore - popl %ds # seg - popl %fs # regs - popl %gs - popal # Restore gp regs - movw $MEM_ESPR-0x16,%sp # Switch to real mode stack - iret # Call target routine -/* - * For the return to real mode we setup a stack frame like this on the real - * mode stack. Note that callf calls won't pop off the flags, but we just - * ignore that by repositioning %sp to be just above the btx_v86 pointer - * so it is aligned. The stack is relative to MEM_ESPR. - * - * -0x04 kernel %esp - * -0x08 btx_v86 - * -0x0c %eax - * -0x10 %ecx - * -0x14 %edx - * -0x18 %ebx - * -0x1c %esp - * -0x20 %ebp - * -0x24 %esi - * -0x28 %edi - * -0x2c %gs - * -0x30 %fs - * -0x34 %ds - * -0x38 %es - * -0x3c %eflags - */ -rret_tramp: movw $MEM_ESPR-0x08,%sp # Reset stack pointer - pushal # Save gp regs - pushl %gs # Save - pushl %fs # seg - pushl %ds # regs - pushl %es - pushfl # Save %eflags - cli # Disable interrupts - std # String ops dec - xorw %ax,%ax # Reset seg - movw %ax,%ds # regs - movw %ax,%es # (%ss is already 0) - lidt idtdesc # Set IDT - lgdt gdtdesc # Set GDT - mov %cr0,%eax # Switch to protected - inc %ax # mode - mov %eax,%cr0 # - ljmp $SEL_SCODE,$rret_tramp.1 # To 32-bit code - .code32 -rret_tramp.1: xorl %ecx,%ecx # Zero - movb $SEL_SDATA,%cl # Setup - movw %cx,%ss # 32-bit - movw %cx,%ds # seg - movw %cx,%es # regs - movl MEM_ESPR-0x04,%esp # Switch to kernel stack - leal 0x44(%esp,1),%esi # Base of frame - andb $~0x2,tss_desc+0x5 # Clear TSS busy - movb $SEL_TSS,%cl # Set task - ltr %cx # register -/* - * Now we are back in protected mode. The kernel stack frame set up - * before entering real mode is still intact. For hardware interrupts, - * leave the frame unchanged. - */ - cmpl $0,MEM_ESPR-0x08 # Leave saved regs unchanged - jz rret_tramp.3 # for hardware ints -/* - * For V86 calls, copy the registers off of the real mode stack onto - * the kernel stack as we want their updated values. Also, initialize - * the segment registers on the kernel stack. - * - * Note that the %esp in the kernel stack after this is garbage, but popa - * ignores it, so we don't have to fix it up. - */ - leal -0x18(%esi),%edi # Kernel stack GP regs - pushl %esi # Save - movl $MEM_ESPR-0x0c,%esi # Real mode stack GP regs - movl $8,%ecx # Copy GP regs from - rep # real mode stack - movsl # to kernel stack - movl $SEL_UDATA,%eax # Selector for data seg regs - movl $4,%ecx # Initialize %ds, - rep # %es, %fs, and - stosl # %gs -/* - * For V86 calls, copy the saved seg regs on the real mode stack back - * over to the btx_v86 structure. Also, conditionally update the - * saved eflags on the kernel stack based on the flags from the user. - */ - movl MEM_ESPR-0x08,%ecx # Get btx_v86 ptr - leal V86_GS(%ecx),%edi # %edi => btx_v86 seg regs - leal MEM_ESPR-0x2c,%esi # %esi => real mode seg regs - xchgl %ecx,%edx # Save btx_v86 ptr - movl $4,%ecx # Copy seg regs - rep # from real mode stack - movsl # to btx_v86 - popl %esi # Restore - movl V86_CTL(%edx),%edx # Read V86 control flags - testl $V86F_FLAGS,%edx # User wants flags? - jz rret_tramp.3 # No - movl MEM_ESPR-0x3c,%eax # Read real mode flags - movw %ax,-0x08(%esi) # Update user flags (low 16) -/* - * Return to the user task - */ -rret_tramp.3: popl %es # Restore - popl %ds # seg - popl %fs # regs - popl %gs - popal # Restore gp regs - addl $4,%esp # Discard int no - iret # Return to user mode - -/* - * System Call. - */ -intx30: cmpl $SYS_EXEC,%eax # Exec system call? - jne intx30.1 # No - pushl %ss # Set up - popl %es # all - pushl %es # segment - popl %ds # registers - pushl %ds # for the - popl %fs # program - pushl %fs # we're - popl %gs # invoking - movl $MEM_USR,%eax # User base address - addl 0xc(%esp,1),%eax # Change to user - leal 0x4(%eax),%esp # stack - popl %eax # Call - call *%eax # program -intx30.1: orb $0x1,%ss:btx_hdr+0x7 # Flag reboot - jmp exit # Exit -/* - * Dump structure [EBX] to [EDI], using format string [ESI]. - */ -dump.0: stosb # Save char -dump: lodsb # Load char - testb %al,%al # End of string? - jz dump.10 # Yes - testb $0x80,%al # Control? - jz dump.0 # No - movb %al,%ch # Save control - movb $'=',%al # Append - stosb # '=' - lodsb # Get offset - pushl %esi # Save - movsbl %al,%esi # To - addl %ebx,%esi # pointer - testb $DMP_X16,%ch # Dump word? - jz dump.1 # No - lodsw # Get and - call hex16 # dump it -dump.1: testb $DMP_X32,%ch # Dump long? - jz dump.2 # No - lodsl # Get and - call hex32 # dump it -dump.2: testb $DMP_MEM,%ch # Dump memory? - jz dump.8 # No - pushl %ds # Save - testl $PSL_VM,0x50(%ebx) # V86 mode? - jnz dump.3 # Yes - verr 0x4(%esi) # Readable selector? - jnz dump.3 # No - ldsl (%esi),%esi # Load pointer - jmp dump.4 # Join common code -dump.3: lodsl # Set offset - xchgl %eax,%edx # Save - lodsl # Get segment - shll $0x4,%eax # * 0x10 - addl %edx,%eax # + offset - xchgl %eax,%esi # Set pointer -dump.4: movb $2,%dl # Num lines -dump.4a: movb $0x10,%cl # Bytes to dump -dump.5: lodsb # Get byte and - call hex8 # dump it - decb %cl # Keep count - jz dump.6a # If done - movb $'-',%al # Separator - cmpb $0x8,%cl # Half way? - je dump.6 # Yes - movb $' ',%al # Use space -dump.6: stosb # Save separator - jmp dump.5 # Continue -dump.6a: decb %dl # Keep count - jz dump.7 # If done - movb $0xa,%al # Line feed - stosb # Save one - movb $7,%cl # Leading - movb $' ',%al # spaces -dump.6b: stosb # Dump - decb %cl # spaces - jnz dump.6b - jmp dump.4a # Next line -dump.7: popl %ds # Restore -dump.8: popl %esi # Restore - movb $0xa,%al # Line feed - testb $DMP_EOL,%ch # End of line? - jnz dump.9 # Yes - movb $' ',%al # Use spaces - stosb # Save one -dump.9: jmp dump.0 # Continue -dump.10: stosb # Terminate string - ret # To caller -/* - * Convert EAX, AX, or AL to hex, saving the result to [EDI]. - */ -hex32: pushl %eax # Save - shrl $0x10,%eax # Do upper - call hex16 # 16 - popl %eax # Restore -hex16: call hex16.1 # Do upper 8 -hex16.1: xchgb %ah,%al # Save/restore -hex8: pushl %eax # Save - shrb $0x4,%al # Do upper - call hex8.1 # 4 - popl %eax # Restore -hex8.1: andb $0xf,%al # Get lower 4 - cmpb $0xa,%al # Convert - sbbb $0x69,%al # to hex - das # digit - orb $0x20,%al # To lower case - stosb # Save char - ret # (Recursive) -/* - * Output zero-terminated string [ESI] to the console. - */ -putstr.0: call putchr # Output char -putstr: lodsb # Load char - testb %al,%al # End of string? - jnz putstr.0 # No - ret # To caller -#ifdef BTX_SERIAL - .set SIO_PRT,SIOPRT # Base port - .set SIO_FMT,SIOFMT # 8N1 - .set SIO_DIV,(115200/SIOSPD) # 115200 / SPD - -/* - * int sio_init(void) - */ -sio_init: movw $SIO_PRT+0x3,%dx # Data format reg - movb $SIO_FMT|0x80,%al # Set format - outb %al,(%dx) # and DLAB - pushl %edx # Save - subb $0x3,%dl # Divisor latch reg - movw $SIO_DIV,%ax # Set - outw %ax,(%dx) # BPS - popl %edx # Restore - movb $SIO_FMT,%al # Clear - outb %al,(%dx) # DLAB - incl %edx # Modem control reg - movb $0x3,%al # Set RTS, - outb %al,(%dx) # DTR - incl %edx # Line status reg - call sio_getc.1 # Get character - -/* - * int sio_flush(void) - */ -sio_flush: xorl %eax,%eax # Return value - xorl %ecx,%ecx # Timeout - movb $0x80,%ch # counter -sio_flush.1: call sio_ischar # Check for character - jz sio_flush.2 # Till none - loop sio_flush.1 # or counter is zero - movb $1, %al # Exhausted all tries -sio_flush.2: ret # To caller - -/* - * void sio_putc(int c) - */ -sio_putc: movw $SIO_PRT+0x5,%dx # Line status reg - xor %ecx,%ecx # Timeout - movb $0x40,%ch # counter -sio_putc.1: inb (%dx),%al # Transmitter - testb $0x20,%al # buffer empty? - loopz sio_putc.1 # No - jz sio_putc.2 # If timeout - movb 0x4(%esp,1),%al # Get character - subb $0x5,%dl # Transmitter hold reg - outb %al,(%dx) # Write character -sio_putc.2: ret $0x4 # To caller - -/* - * int sio_getc(void) - */ -sio_getc: call sio_ischar # Character available? - jz sio_getc # No -sio_getc.1: subb $0x5,%dl # Receiver buffer reg - inb (%dx),%al # Read character - ret # To caller - -/* - * int sio_ischar(void) - */ -sio_ischar: movw $SIO_PRT+0x5,%dx # Line status register - xorl %eax,%eax # Zero - inb (%dx),%al # Received data - andb $0x1,%al # ready? - ret # To caller - -/* - * Output character AL to the serial console. - */ -putchr: pusha # Save - cmpb $10, %al # is it a newline? - jne putchr.1 # no?, then leave - push $13 # output a carriage - call sio_putc # return first - movb $10, %al # restore %al -putchr.1: pushl %eax # Push the character - # onto the stack - call sio_putc # Output the character - popa # Restore - ret # To caller -#else -/* - * Output character AL to the console. - */ -putchr: pusha # Save - xorl %ecx,%ecx # Zero for loops - movb $SCR_MAT,%ah # Mode/attribute - movl $BDA_POS,%ebx # BDA pointer - movw (%ebx),%dx # Cursor position - movl $0xa0000,%edi -putchr.1: cmpb $0xa,%al # New line? - je putchr.2 # Yes - movw %dx,%cx - movb %al,(%edi,%ecx,1) # Write char - addl $0x2000,%ecx - movb %ah,(%edi,%ecx,1) # Write attr - addw $0x02,%dx - jmp putchr.3 -putchr.2: movw %dx,%ax - movb $SCR_COL*2,%dl - div %dl - incb %al - mul %dl - movw %ax,%dx -putchr.3: cmpw $SCR_ROW*SCR_COL*2,%dx - jb putchr.4 # No - leal 2*SCR_COL(%edi),%esi # New top line - movw $(SCR_ROW-1)*SCR_COL/2,%cx # Words to move - rep # Scroll - movsl # screen - movb $0x20,%al # Space - xorb %ah,%ah - movb $SCR_COL,%cl # Columns to clear - rep # Clear - stosw # line - movw $(SCR_ROW-1)*SCR_COL*2,%dx -putchr.4: movw %dx,(%ebx) # Update position - popa # Restore - ret # To caller -#endif - - .code16 -/* - * Real Mode Hardware interrupt jump table. - */ -intr20: push $0x8 # Int 0x20: IRQ0 - jmp int_hwr # V86 int 0x8 - push $0x9 # Int 0x21: IRQ1 - jmp int_hwr # V86 int 0x9 - push $0xa # Int 0x22: IRQ2 - jmp int_hwr # V86 int 0xa - push $0xb # Int 0x23: IRQ3 - jmp int_hwr # V86 int 0xb - push $0xc # Int 0x24: IRQ4 - jmp int_hwr # V86 int 0xc - push $0xd # Int 0x25: IRQ5 - jmp int_hwr # V86 int 0xd - push $0xe # Int 0x26: IRQ6 - jmp int_hwr # V86 int 0xe - push $0xf # Int 0x27: IRQ7 - jmp int_hwr # V86 int 0xf - push $0x10 # Int 0x28: IRQ8 - jmp int_hwr # V86 int 0x10 - push $0x11 # Int 0x29: IRQ9 - jmp int_hwr # V86 int 0x11 - push $0x12 # Int 0x2a: IRQ10 - jmp int_hwr # V86 int 0x12 - push $0x13 # Int 0x2b: IRQ11 - jmp int_hwr # V86 int 0x13 - push $0x14 # Int 0x2c: IRQ12 - jmp int_hwr # V86 int 0x14 - push $0x15 # Int 0x2d: IRQ13 - jmp int_hwr # V86 int 0x15 - push $0x16 # Int 0x2e: IRQ14 - jmp int_hwr # V86 int 0x16 - push $0x17 # Int 0x2f: IRQ15 - jmp int_hwr # V86 int 0x17 -/* - * Reflect hardware interrupts in real mode. - */ -int_hwr: push %ax # Save - push %ds # Save - push %bp # Save - mov %sp,%bp # Address stack frame - xchg %bx,6(%bp) # Swap BX, int no - xor %ax,%ax # Set %ds:%bx to - shl $2,%bx # point to - mov %ax,%ds # IDT entry - mov (%bx),%ax # Load IP - mov 2(%bx),%bx # Load CS - xchg %ax,4(%bp) # Swap saved %ax,%bx with - xchg %bx,6(%bp) # CS:IP of handler - pop %bp # Restore - pop %ds # Restore - lret # Jump to handler - - .p2align 4 -/* - * Global descriptor table. - */ -gdt: .word 0x0,0x0,0x0,0x0 # Null entry - .word 0xffff,0x0,0x9a00,0xcf # SEL_SCODE - .word 0xffff,0x0,0x9200,0xcf # SEL_SDATA - .word 0xffff,0x0,0x9a00,0x0 # SEL_RCODE - .word 0xffff,0x0,0x9200,0x0 # SEL_RDATA - .word 0xffff,MEM_USR,0xfa00,0xcf# SEL_UCODE - .word 0xffff,MEM_USR,0xf200,0xcf# SEL_UDATA -tss_desc: .word _TSSLM,MEM_TSS,0x8900,0x0 # SEL_TSS -gdt.1: -/* - * Pseudo-descriptors. - */ -gdtdesc: .word gdt.1-gdt-1,gdt,0x0 # GDT -idtdesc: .word _IDTLM,MEM_IDT,0x0 # IDT -ivtdesc: .word 0x400-0x0-1,0x0,0x0 # IVT -/* - * IDT construction control string. - */ -idtctl: .byte 0x10, 0x8e # Int 0x0-0xf - .word 0x7dfb,intx00 # (exceptions) - .byte 0x10, 0x8e # Int 0x10 - .word 0x1, intx10 # (exception) - .byte 0x10, 0x8e # Int 0x20-0x2f - .word 0xffff,intx20 # (hardware) - .byte 0x1, 0xee # int 0x30 - .word 0x1, intx30 # (system call) - .byte 0x2, 0xee # Int 0x31-0x32 - .word 0x1, intx31 # (V86, null) - .byte 0x0 # End of string -/* - * Dump format string. - */ -dmpfmt: .byte '\n' # "\n" - .ascii "int" # "int=" - .byte 0x80|DMP_X32, 0x40 # "00000000 " - .ascii "err" # "err=" - .byte 0x80|DMP_X32, 0x44 # "00000000 " - .ascii "efl" # "efl=" - .byte 0x80|DMP_X32, 0x50 # "00000000 " - .ascii "eip" # "eip=" - .byte 0x80|DMP_X32|DMP_EOL,0x48 # "00000000\n" - .ascii "eax" # "eax=" - .byte 0x80|DMP_X32, 0x34 # "00000000 " - .ascii "ebx" # "ebx=" - .byte 0x80|DMP_X32, 0x28 # "00000000 " - .ascii "ecx" # "ecx=" - .byte 0x80|DMP_X32, 0x30 # "00000000 " - .ascii "edx" # "edx=" - .byte 0x80|DMP_X32|DMP_EOL,0x2c # "00000000\n" - .ascii "esi" # "esi=" - .byte 0x80|DMP_X32, 0x1c # "00000000 " - .ascii "edi" # "edi=" - .byte 0x80|DMP_X32, 0x18 # "00000000 " - .ascii "ebp" # "ebp=" - .byte 0x80|DMP_X32, 0x20 # "00000000 " - .ascii "esp" # "esp=" - .byte 0x80|DMP_X32|DMP_EOL,0x0 # "00000000\n" - .ascii "cs" # "cs=" - .byte 0x80|DMP_X16, 0x4c # "0000 " - .ascii "ds" # "ds=" - .byte 0x80|DMP_X16, 0xc # "0000 " - .ascii "es" # "es=" - .byte 0x80|DMP_X16, 0x8 # "0000 " - .ascii " " # " " - .ascii "fs" # "fs=" - .byte 0x80|DMP_X16, 0x10 # "0000 " - .ascii "gs" # "gs=" - .byte 0x80|DMP_X16, 0x14 # "0000 " - .ascii "ss" # "ss=" - .byte 0x80|DMP_X16|DMP_EOL,0x4 # "0000\n" - .ascii "cs:eip" # "cs:eip=" - .byte 0x80|DMP_MEM|DMP_EOL,0x48 # "00 00 ... 00 00\n" - .ascii "ss:esp" # "ss:esp=" - .byte 0x80|DMP_MEM|DMP_EOL,0x0 # "00 00 ... 00 00\n" - .asciz "BTX halted\n" # End -/* - * Bad VM86 call panic - */ -badvm86: .asciz "Invalid VM86 Request\n" - -/* - * End of BTX memory. - */ - .p2align 4 -break: diff --git a/sys/boot/pc98/btx/btxldr/Makefile b/sys/boot/pc98/btx/btxldr/Makefile deleted file mode 100644 index 47e83a083056..000000000000 --- a/sys/boot/pc98/btx/btxldr/Makefile +++ /dev/null @@ -1,21 +0,0 @@ -# $FreeBSD$ - -PROG= btxldr -INTERNALPROG= -MAN= -SRCS= btxldr.S - -CFLAGS+=-DLOADER_ADDRESS=${LOADER_ADDRESS} -CFLAGS+=-I${.CURDIR}/../../../i386/common - -.if defined(BTXLDR_VERBOSE) -CFLAGS+=-DBTXLDR_VERBOSE -.endif - -ORG=${LOADER_ADDRESS} -LDFLAGS=${LDFLAGS_BIN} - -.include <bsd.prog.mk> - -# XXX: clang integrated-as doesn't grok .codeNN directives yet -CFLAGS.btxldr.S= ${CLANG_NO_IAS} diff --git a/sys/boot/pc98/btx/btxldr/btxldr.S b/sys/boot/pc98/btx/btxldr/btxldr.S deleted file mode 100644 index 9a6483f72c3d..000000000000 --- a/sys/boot/pc98/btx/btxldr/btxldr.S +++ /dev/null @@ -1,430 +0,0 @@ -/* - * Copyright (c) 1998 Robert Nordier - * All rights reserved. - * - * Redistribution and use in source and binary forms are freely - * permitted provided that the above copyright notice and this - * paragraph and the following disclaimer are duplicated in all - * such forms. - * - * This software is provided "AS IS" and without any express or - * implied warranties, including, without limitation, the implied - * warranties of merchantability and fitness for a particular - * purpose. - * - * $FreeBSD$ - */ - -#include <bootargs.h> - -/* - * Prototype BTX loader program, written in a couple of hours. The - * real thing should probably be more flexible, and in C. - */ - -/* - * Memory locations. - */ - .set MEM_STUB,0x600 # Real mode stub - .set MEM_ESP,0x1000 # New stack pointer - .set MEM_TBL,0x5000 # BTX page tables - .set MEM_ENTRY,0x9010 # BTX entry point - .set MEM_DATA,start+0x1000 # Data segment -/* - * Segment selectors. - */ - .set SEL_SCODE,0x8 # 4GB code - .set SEL_SDATA,0x10 # 4GB data - .set SEL_RCODE,0x18 # 64K code - .set SEL_RDATA,0x20 # 64K data -/* - * Paging constants. - */ - .set PAG_SIZ,0x1000 # Page size - .set PAG_ENT,0x4 # Page entry size -/* - * Screen constants. - */ - .set SCR_MAT,0xe1 # Mode/attribute - .set SCR_COL,0x50 # Columns per row - .set SCR_ROW,0x19 # Rows per screen -/* - * BIOS Data Area locations. - */ - .set BDA_MEM,0xa1501 # Free memory - .set BDA_POS,0xa153e # Cursor position -/* - * Required by aout gas inadequacy. - */ - .set SIZ_STUB,0x1a # Size of stub -/* - * We expect to be loaded by boot2 at the origin defined in ./Makefile. - */ - .globl start -/* - * BTX program loader for ELF clients. - */ -start: cld # String ops inc - cli -gdcwait.1: inb $0x60,%al - testb $0x04,%al - jz gdcwait.1 - movb $0xe0,%al - outb %al,$0x62 - nop -gdcwait.2: inb $0x60,%al - testb $0x01,%al - jz gdcwait.2 - inb $0x62,%al - movb %al,%dl - inb $0x62,%al - movb %al,%dh - inb $0x62,%al - inb $0x62,%al - inb $0x62,%al - shlw $1,%dx - movl $BDA_POS,%ebx - movw %dx,(%ebx) - movl $m_logo,%esi # Identify - call putstr # ourselves - movzwl BDA_MEM,%eax # Get base memory - andl $0x7,%eax - incl %eax - shll $0x11,%eax # in bytes - movl %eax,%ebp # Base of user stack -#ifdef BTXLDR_VERBOSE - movl $m_mem,%esi # Display - call hexout # amount of - call putstr # base memory -#endif - lgdt gdtdesc # Load new GDT -/* - * Relocate caller's arguments. - */ -#ifdef BTXLDR_VERBOSE - movl $m_esp,%esi # Display - movl %esp,%eax # caller - call hexout # stack - call putstr # pointer - movl $m_args,%esi # Format string - leal 0x4(%esp),%ebx # First argument - movl $0x6,%ecx # Count -start.1: movl (%ebx),%eax # Get argument and - addl $0x4,%ebx # bump pointer - call hexout # Display it - loop start.1 # Till done - call putstr # End message -#endif - movl BA_BOOTINFO+4(%esp),%esi # Source: bootinfo - cmpl $0x0, %esi # If the bootinfo pointer - je start_null_bi # is null, don't copy it - movl BI_SIZE(%esi),%ecx # Allocate space - subl %ecx,%ebp # for bootinfo - movl %ebp,%edi # Destination - rep # Copy - movsb # it - movl %ebp,BA_BOOTINFO+4(%esp) # Update pointer - movl %edi,%ebp # Restore base pointer -#ifdef BTXLDR_VERBOSE - movl $m_rel_bi,%esi # Display - movl %ebp,%eax # bootinfo - call hexout # relocation - call putstr # message -#endif -start_null_bi: movl $BOOTARGS_SIZE,%ecx # Fixed size of arguments - testl $KARGS_FLAGS_EXTARG, BA_BOOTFLAGS+4(%esp) # Check for extra data - jz start_fixed # Skip if the flag is not set - addl BOOTARGS_SIZE+4(%esp),%ecx # Add size of variable args -start_fixed: subl $ARGOFF,%ebp # Place args at fixed offset - leal 0x4(%esp),%esi # Source - movl %ebp,%edi # Destination - rep # Copy - movsb # them -#ifdef BTXLDR_VERBOSE - movl $m_rel_args,%esi # Display - movl %ebp,%eax # argument - call hexout # relocation - call putstr # message -#endif -/* - * Set up BTX kernel. - */ - movl $MEM_ESP,%esp # Set up new stack - movl $MEM_DATA,%ebx # Data segment - movl $m_vers,%esi # Display BTX - call putstr # version message - movb 0x5(%ebx),%al # Get major version - addb $'0',%al # Display - call putchr # it - movb $'.',%al # And a - call putchr # dot - movb 0x6(%ebx),%al # Get minor - xorb %ah,%ah # version - movb $0xa,%dl # Divide - divb %dl,%al # by 10 - addb $'0',%al # Display - call putchr # tens - movb %ah,%al # Get units - addb $'0',%al # Display - call putchr # units - call putstr # End message - movl %ebx,%esi # BTX image - movzwl 0x8(%ebx),%edi # Compute - orl $PAG_SIZ/PAG_ENT-1,%edi # the - incl %edi # BTX - shll $0x2,%edi # load - addl $MEM_TBL,%edi # address - pushl %edi # Save load address - movzwl 0xa(%ebx),%ecx # Image size -#ifdef BTXLDR_VERBOSE - pushl %ecx # Save image size -#endif - rep # Relocate - movsb # BTX - movl %esi,%ebx # Keep place -#ifdef BTXLDR_VERBOSE - movl $m_rel_btx,%esi # Restore - popl %eax # parameters - call hexout # and -#endif - popl %ebp # display -#ifdef BTXLDR_VERBOSE - movl %ebp,%eax # the - call hexout # relocation - call putstr # message -#endif - addl $PAG_SIZ,%ebp # Display -#ifdef BTXLDR_VERBOSE - movl $m_base,%esi # the - movl %ebp,%eax # user - call hexout # base - call putstr # address -#endif -/* - * Set up ELF-format client program. - */ - cmpl $0x464c457f,(%ebx) # ELF magic number? - je start.3 # Yes - movl $e_fmt,%esi # Display error - call putstr # message -start.2: jmp start.2 # Hang -start.3: -#ifdef BTXLDR_VERBOSE - movl $m_elf,%esi # Display ELF - call putstr # message - movl $m_segs,%esi # Format string -#endif - movl $0x2,%edi # Segment count - movl 0x1c(%ebx),%edx # Get e_phoff - addl %ebx,%edx # To pointer - movzwl 0x2c(%ebx),%ecx # Get e_phnum -start.4: cmpl $0x1,(%edx) # Is p_type PT_LOAD? - jne start.6 # No -#ifdef BTXLDR_VERBOSE - movl 0x4(%edx),%eax # Display - call hexout # p_offset - movl 0x8(%edx),%eax # Display - call hexout # p_vaddr - movl 0x10(%edx),%eax # Display - call hexout # p_filesz - movl 0x14(%edx),%eax # Display - call hexout # p_memsz - call putstr # End message -#endif - pushl %esi # Save - pushl %edi # working - pushl %ecx # registers - movl 0x4(%edx),%esi # Get p_offset - addl %ebx,%esi # as pointer - movl 0x8(%edx),%edi # Get p_vaddr - addl %ebp,%edi # as pointer - movl 0x10(%edx),%ecx # Get p_filesz - rep # Set up - movsb # segment - movl 0x14(%edx),%ecx # Any bytes - subl 0x10(%edx),%ecx # to zero? - jz start.5 # No - xorb %al,%al # Then - rep # zero - stosb # them -start.5: popl %ecx # Restore - popl %edi # working - popl %esi # registers - decl %edi # Segments to do - je start.7 # If none -start.6: addl $0x20,%edx # To next entry - loop start.4 # Till done -start.7: -#ifdef BTXLDR_VERBOSE - movl $m_done,%esi # Display done - call putstr # message -#endif - movl $start.8,%esi # Real mode stub - movl $MEM_STUB,%edi # Destination - movl $start.9-start.8,%ecx # Size - rep # Relocate - movsb # it - ljmp $SEL_RCODE,$MEM_STUB # To 16-bit code - .code16 -start.8: xorw %ax,%ax # Data - movb $SEL_RDATA,%al # selector - movw %ax,%ss # Reload SS - movw %ax,%ds # Reset - movw %ax,%es # other - movw %ax,%fs # segment - movw %ax,%gs # limits - movl %cr0,%eax # Switch to - decw %ax # real - movl %eax,%cr0 # mode - ljmp $0,$MEM_ENTRY # Jump to BTX entry point -start.9: - .code32 -/* - * Output message [ESI] followed by EAX in hex. - */ -hexout: pushl %eax # Save - call putstr # Display message - popl %eax # Restore - pushl %esi # Save - pushl %edi # caller's - movl $buf,%edi # Buffer - pushl %edi # Save - call hex32 # To hex - xorb %al,%al # Terminate - stosb # string - popl %esi # Restore -hexout.1: lodsb # Get a char - cmpb $'0',%al # Leading zero? - je hexout.1 # Yes - testb %al,%al # End of string? - jne hexout.2 # No - decl %esi # Undo -hexout.2: decl %esi # Adjust for inc - call putstr # Display hex - popl %edi # Restore - popl %esi # caller's - ret # To caller -/* - * Output zero-terminated string [ESI] to the console. - */ -putstr.0: call putchr # Output char -putstr: lodsb # Load char - testb %al,%al # End of string? - jne putstr.0 # No - ret # To caller -/* - * Output character AL to the console. - */ -putchr: pusha # Save - xorl %ecx,%ecx # Zero for loops - movb $SCR_MAT,%ah # Mode/attribute - movl $BDA_POS,%ebx # BDA pointer - movw (%ebx),%dx # Cursor position - movl $0xa0000,%edi # Regen buffer (color) -putchr.1: cmpb $0xa,%al # New line? - je putchr.2 # Yes - movw %dx,%cx - movb %al,(%edi,%ecx,1) # Write char - addl $0x2000,%ecx - movb %ah,(%edi,%ecx,1) # Write attr - addw $0x2,%dx - jmp putchr.3 -putchr.2: movw %dx,%ax - movb $SCR_COL*2,%dl - div %dl - incb %al - mul %dl - movw %ax,%dx -putchr.3: cmpw $SCR_COL*SCR_ROW*2,%dx - jb putchr.4 # No - leal 2*SCR_COL(%edi),%esi # New top line - movw $(SCR_ROW-1)*SCR_COL/2,%cx # Words to move - rep # Scroll - movsl # screen - movb $' ',%al # Space - xorb %ah,%ah - movb $SCR_COL,%cl # Columns to clear - rep # Clear - stosw # line - movw $(SCR_ROW-1)*SCR_COL*2,%dx -putchr.4: movw %dx,(%ebx) # Update position - shrw $1,%dx -gdcwait.3: inb $0x60,%al - testb $0x04,%al - jz gdcwait.3 - movb $0x49,%al - outb %al,$0x62 - movb %dl,%al - outb %al,$0x60 - movb %dh,%al - outb %al,$0x60 - popa # Restore - ret # To caller -/* - * Convert EAX, AX, or AL to hex, saving the result to [EDI]. - */ -hex32: pushl %eax # Save - shrl $0x10,%eax # Do upper - call hex16 # 16 - popl %eax # Restore -hex16: call hex16.1 # Do upper 8 -hex16.1: xchgb %ah,%al # Save/restore -hex8: pushl %eax # Save - shrb $0x4,%al # Do upper - call hex8.1 # 4 - popl %eax # Restore -hex8.1: andb $0xf,%al # Get lower 4 - cmpb $0xa,%al # Convert - sbbb $0x69,%al # to hex - das # digit - orb $0x20,%al # To lower case - stosb # Save char - ret # (Recursive) - - .data - .p2align 4 -/* - * Global descriptor table. - */ -gdt: .word 0x0,0x0,0x0,0x0 # Null entry - .word 0xffff,0x0,0x9a00,0xcf # SEL_SCODE - .word 0xffff,0x0,0x9200,0xcf # SEL_SDATA - .word 0xffff,0x0,0x9a00,0x0 # SEL_RCODE - .word 0xffff,0x0,0x9200,0x0 # SEL_RDATA -gdt.1: -gdtdesc: .word gdt.1-gdt-1 # Limit - .long gdt # Base -/* - * Messages. - */ -m_logo: .asciz " \nBTX loader 1.00 " -m_vers: .asciz "BTX version is \0\n" -e_fmt: .asciz "Error: Client format not supported\n" -#ifdef BTXLDR_VERBOSE -m_mem: .asciz "Starting in protected mode (base mem=\0)\n" -m_esp: .asciz "Arguments passed (esp=\0):\n" -m_args: .asciz"<howto=" - .asciz" bootdev=" - .asciz" junk=" - .asciz" " - .asciz" " - .asciz" bootinfo=\0>\n" -m_rel_bi: .asciz "Relocated bootinfo (size=48) to \0\n" -m_rel_args: .asciz "Relocated arguments (size=18) to \0\n" -m_rel_btx: .asciz "Relocated kernel (size=\0) to \0\n" -m_base: .asciz "Client base address is \0\n" -m_elf: .asciz "Client format is ELF\n" -m_segs: .asciz "text segment: offset=" - .asciz " vaddr=" - .asciz " filesz=" - .asciz " memsz=\0\n" - .asciz "data segment: offset=" - .asciz " vaddr=" - .asciz " filesz=" - .asciz " memsz=\0\n" -m_done: .asciz "Loading complete\n" -#endif -/* - * Uninitialized data area. - */ -buf: # Scratch buffer diff --git a/sys/boot/pc98/btx/lib/Makefile b/sys/boot/pc98/btx/lib/Makefile deleted file mode 100644 index e5876bc1371d..000000000000 --- a/sys/boot/pc98/btx/lib/Makefile +++ /dev/null @@ -1,10 +0,0 @@ -# $FreeBSD$ - -PROG= crt0.o -INTERNALPROG= -MAN= -SRCS= btxcsu.S btxsys.s btxv86.s -CFLAGS+=-I${.CURDIR}/../../../i386/common -LDFLAGS=-Wl,-r - -.include <bsd.prog.mk> diff --git a/sys/boot/pc98/btx/lib/btxcsu.S b/sys/boot/pc98/btx/lib/btxcsu.S deleted file mode 100644 index c46f8097dbe3..000000000000 --- a/sys/boot/pc98/btx/lib/btxcsu.S +++ /dev/null @@ -1,49 +0,0 @@ -# -# Copyright (c) 1998 Robert Nordier -# All rights reserved. -# -# Redistribution and use in source and binary forms are freely -# permitted provided that the above copyright notice and this -# paragraph and the following disclaimer are duplicated in all -# such forms. -# -# This software is provided "AS IS" and without any express or -# implied warranties, including, without limitation, the implied -# warranties of merchantability and fitness for a particular -# purpose. -# - -# $FreeBSD$ - -#include <bootargs.h> - -# -# BTX C startup code (ELF). -# - -# -# Globals. -# - .global _start -# -# Client entry point. -# -_start: cld - pushl %eax - movl $_edata,%edi - movl $_end,%ecx - subl %edi, %ecx - xorb %al, %al - rep - stosb - popl __base - movl %esp,%eax # Set - addl $ARGADJ,%eax # argument - movl %eax,__args # pointer - call main # Invoke client main() - call exit # Invoke client exit() -# -# Data. -# - .comm __base,4 # Client base address - .comm __args,4 # Client arguments diff --git a/sys/boot/pc98/btx/lib/btxsys.s b/sys/boot/pc98/btx/lib/btxsys.s deleted file mode 100644 index 9c77b4295e7c..000000000000 --- a/sys/boot/pc98/btx/lib/btxsys.s +++ /dev/null @@ -1,40 +0,0 @@ -# -# Copyright (c) 1998 Robert Nordier -# All rights reserved. -# -# Redistribution and use in source and binary forms are freely -# permitted provided that the above copyright notice and this -# paragraph and the following disclaimer are duplicated in all -# such forms. -# -# This software is provided "AS IS" and without any express or -# implied warranties, including, without limitation, the implied -# warranties of merchantability and fitness for a particular -# purpose. -# - -# $FreeBSD$ - -# -# BTX system calls. -# - -# -# Globals. -# - .global __exit - .global __exec -# -# Constants. -# - .set INT_SYS,0x30 # Interrupt number -# -# System call: exit -# -__exit: xorl %eax,%eax # BTX system - int $INT_SYS # call 0x0 -# -# System call: exec -# -__exec: movl $0x1,%eax # BTX system - int $INT_SYS # call 0x1 diff --git a/sys/boot/pc98/btx/lib/btxv86.h b/sys/boot/pc98/btx/lib/btxv86.h deleted file mode 100644 index 27f6b3404248..000000000000 --- a/sys/boot/pc98/btx/lib/btxv86.h +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright (c) 1998 Robert Nordier - * All rights reserved. - * - * Redistribution and use in source and binary forms are freely - * permitted provided that the above copyright notice and this - * paragraph and the following disclaimer are duplicated in all - * such forms. - * - * This software is provided "AS IS" and without any express or - * implied warranties, including, without limitation, the implied - * warranties of merchantability and fitness for a particular - * purpose. - */ - -/* - * $FreeBSD$ - */ - -#ifndef _BTXV86_H_ -#define _BTXV86_H_ - -#include <sys/types.h> -#include <machine/psl.h> - -#define V86_ADDR 0x10000 /* Segment:offset address */ -#define V86_CALLF 0x20000 /* Emulate far call */ -#define V86_FLAGS 0x40000 /* Return flags */ - -struct __v86 { - uint32_t ctl; /* Control flags */ - uint32_t addr; /* Interrupt number or address */ - uint32_t es; /* V86 ES register */ - uint32_t ds; /* V86 DS register */ - uint32_t fs; /* V86 FS register */ - uint32_t gs; /* V86 GS register */ - uint32_t eax; /* V86 EAX register */ - uint32_t ecx; /* V86 ECX register */ - uint32_t edx; /* V86 EDX register */ - uint32_t ebx; /* V86 EBX register */ - uint32_t efl; /* V86 eflags register */ - uint32_t ebp; /* V86 EBP register */ - uint32_t esi; /* V86 ESI register */ - uint32_t edi; /* V86 EDI register */ -}; - -extern struct __v86 __v86; /* V86 interface structure */ -void __v86int(void); - -#define v86 __v86 -#define v86int __v86int - -extern u_int32_t __base; -extern u_int32_t __args; - -#define PTOV(pa) ((caddr_t)(pa) - __base) -#define VTOP(va) ((vm_offset_t)(va) + __base) -#define VTOPSEG(va) (u_int16_t)(VTOP((caddr_t)va) >> 4) -#define VTOPOFF(va) (u_int16_t)(VTOP((caddr_t)va) & 0xf) - -#define V86_CY(x) ((x) & PSL_C) -#define V86_ZR(x) ((x) & PSL_Z) - -void __exit(int) __attribute__((__noreturn__)); -void __exec(caddr_t, ...); - -#endif /* !_BTXV86_H_ */ diff --git a/sys/boot/pc98/btx/lib/btxv86.s b/sys/boot/pc98/btx/lib/btxv86.s deleted file mode 100644 index 0d7d1116322d..000000000000 --- a/sys/boot/pc98/btx/lib/btxv86.s +++ /dev/null @@ -1,85 +0,0 @@ -# -# Copyright (c) 1998 Robert Nordier -# All rights reserved. -# -# Redistribution and use in source and binary forms are freely -# permitted provided that the above copyright notice and this -# paragraph and the following disclaimer are duplicated in all -# such forms. -# -# This software is provided "AS IS" and without any express or -# implied warranties, including, without limitation, the implied -# warranties of merchantability and fitness for a particular -# purpose. -# - -# $FreeBSD$ - -# -# BTX V86 interface. -# - -# -# Globals. -# - .global __v86int -# -# Fields in V86 interface structure. -# - .set V86_CTL,0x0 # Control flags - .set V86_ADDR,0x4 # Int number/address - .set V86_ES,0x8 # V86 ES - .set V86_DS,0xc # V86 DS - .set V86_FS,0x10 # V86 FS - .set V86_GS,0x14 # V86 GS - .set V86_EAX,0x18 # V86 EAX - .set V86_ECX,0x1c # V86 ECX - .set V86_EDX,0x20 # V86 EDX - .set V86_EBX,0x24 # V86 EBX - .set V86_EFL,0x28 # V86 eflags - .set V86_EBP,0x2c # V86 EBP - .set V86_ESI,0x30 # V86 ESI - .set V86_EDI,0x34 # V86 EDI -# -# Other constants. -# - .set INT_V86,0x31 # Interrupt number - .set SIZ_V86,0x38 # Size of V86 structure -# -# V86 interface function. -# -__v86int: popl __v86ret # Save return address - pushl $__v86 # Push pointer - call __v86_swap # Load V86 registers - int $INT_V86 # To BTX - call __v86_swap # Load user registers - addl $0x4,%esp # Discard pointer - pushl __v86ret # Restore return address - ret # To user -# -# Swap V86 and user registers. -# -__v86_swap: xchgl %ebp,0x4(%esp,1) # Swap pointer, EBP - xchgl %eax,V86_EAX(%ebp) # Swap EAX - xchgl %ecx,V86_ECX(%ebp) # Swap ECX - xchgl %edx,V86_EDX(%ebp) # Swap EDX - xchgl %ebx,V86_EBX(%ebp) # Swap EBX - pushl %eax # Save - pushf # Put eflags - popl %eax # in EAX - xchgl %eax,V86_EFL(%ebp) # Swap - pushl %eax # Put EAX - popf # in eflags - movl 0x8(%esp,1),%eax # Load EBP - xchgl %eax,V86_EBP(%ebp) # Swap - movl %eax,0x8(%esp,1) # Save EBP - popl %eax # Restore - xchgl %esi,V86_ESI(%ebp) # Swap ESI - xchgl %edi,V86_EDI(%ebp) # Swap EDI - xchgl %ebp,0x4(%esp,1) # Swap pointer, EBP - ret # To caller -# -# V86 interface structure. -# - .comm __v86,SIZ_V86 - .comm __v86ret,4 diff --git a/sys/boot/pc98/cdboot/Makefile b/sys/boot/pc98/cdboot/Makefile deleted file mode 100644 index ba94111362c5..000000000000 --- a/sys/boot/pc98/cdboot/Makefile +++ /dev/null @@ -1,18 +0,0 @@ -# $FreeBSD$ - -PROG= cdboot -STRIP= -BINMODE=${NOBINMODE} -MAN= -SRCS= ${PROG}.S - -CFLAGS+=-I${.CURDIR}/../../i386/common - -ORG= 0x0000 - -LDFLAGS=${LDFLAGS_BIN} - -.include <bsd.prog.mk> - -# XXX: clang integrated-as doesn't grok .codeNN directives yet -CFLAGS.cdboot.S= ${CLANG_NO_IAS} diff --git a/sys/boot/pc98/cdboot/cdboot.S b/sys/boot/pc98/cdboot/cdboot.S deleted file mode 100644 index c97c02bea31b..000000000000 --- a/sys/boot/pc98/cdboot/cdboot.S +++ /dev/null @@ -1,805 +0,0 @@ -# -# Copyright (c) 2006 TAKAHASHI Yoshihiro <nyan@FreeBSD.org> -# Copyright (c) 2001 John Baldwin <jhb@FreeBSD.org> -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions -# are met: -# 1. Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# 2. Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. -# -# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND -# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE -# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -# SUCH DAMAGE. -# - -# $FreeBSD$ - -# -# Basically, we first create a set of boot arguments to pass to the loaded -# binary. Then we attempt to load /boot/loader from the CD we were booted -# off of. -# - -#include <bootargs.h> - -# -# Memory locations. -# - .set STACK_OFF,0x6000 # Stack offset - .set LOAD_SEG,0x0700 # Load segment - .set LOAD_SIZE,2048 # Load size - .set DAUA,0x0584 # DA/UA - - .set MEM_PAGE_SIZE,0x1000 # memory page size, 4k - .set MEM_ARG,0x900 # Arguments at start - .set MEM_ARG_BTX,0xa100 # Where we move them to so the - # BTX client can see them - .set MEM_ARG_SIZE,0x18 # Size of the arguments - .set MEM_BTX_ADDRESS,0x9000 # where BTX lives - .set MEM_BTX_ENTRY,0x9010 # where BTX starts to execute - .set MEM_BTX_OFFSET,MEM_PAGE_SIZE # offset of BTX in the loader - .set MEM_BTX_CLIENT,0xa000 # where BTX clients live -# -# PC98 machine type from sys/pc98/pc98/pc98_machdep.h -# - .set MEM_SYS, 0xa100 # System common area segment - .set PC98_MACHINE_TYPE, 0x0620 # PC98 machine type - .set EPSON_ID, 0x0624 # EPSON machine id - - .set M_NEC_PC98, 0x0001 - .set M_EPSON_PC98, 0x0002 - .set M_NOT_H98, 0x0010 - .set M_H98, 0x0020 - .set M_NOTE, 0x0040 - .set M_NORMAL, 0x1000 - .set M_8M, 0x8000 -# -# Signature Constants -# - .set SIG1_OFF,0x1fe # Signature offset - .set SIG2_OFF,0x7fe # Signature offset -# -# a.out header fields -# - .set AOUT_TEXT,0x04 # text segment size - .set AOUT_DATA,0x08 # data segment size - .set AOUT_BSS,0x0c # zero'd BSS size - .set AOUT_SYMBOLS,0x10 # symbol table - .set AOUT_ENTRY,0x14 # entry point - .set AOUT_HEADER,MEM_PAGE_SIZE # size of the a.out header -# -# Segment selectors. -# - .set SEL_SDATA,0x8 # Supervisor data - .set SEL_RDATA,0x10 # Real mode data - .set SEL_SCODE,0x18 # PM-32 code - .set SEL_SCODE16,0x20 # PM-16 code -# -# BTX constants -# - .set INT_SYS,0x30 # BTX syscall interrupt -# -# Constants for reading from the CD. -# - .set ERROR_TIMEOUT,0x90 # BIOS timeout on read - .set NUM_RETRIES,3 # Num times to retry - .set SECTOR_SIZE,0x800 # size of a sector - .set SECTOR_SHIFT,11 # number of place to shift - .set BUFFER_LEN,0x100 # number of sectors in buffer - .set MAX_READ,0xf800 # max we can read at a time - .set MAX_READ_SEC,MAX_READ >> SECTOR_SHIFT - .set MEM_READ_BUFFER,0x9000 # buffer to read from CD - .set MEM_VOLDESC,MEM_READ_BUFFER # volume descriptor - .set MEM_DIR,MEM_VOLDESC+SECTOR_SIZE # Lookup buffer - .set VOLDESC_LBA,0x10 # LBA of vol descriptor - .set VD_PRIMARY,1 # Primary VD - .set VD_END,255 # VD Terminator - .set VD_ROOTDIR,156 # Offset of Root Dir Record - .set DIR_LEN,0 # Offset of Dir Record length - .set DIR_EA_LEN,1 # Offset of EA length - .set DIR_EXTENT,2 # Offset of 64-bit LBA - .set DIR_SIZE,10 # Offset of 64-bit length - .set DIR_NAMELEN,32 # Offset of 8-bit name len - .set DIR_NAME,33 # Offset of dir name - -# -# Program start. -# - .code16 - .globl start - -start: jmp main - - .org 4 - .ascii "IPL1 " - -main: cld - - /* Setup the stack */ - xor %ax,%ax - mov %ax,%ss - mov $STACK_OFF,%sp - - push %ecx - - /* Setup graphic screen */ - mov $0x42,%ah # 640x400 - mov $0xc0,%ch - int $0x18 - mov $0x40,%ah # graph on - int $0x18 - - /* Setup text screen */ - mov $0x0a00,%ax # 80x25 - int $0x18 - mov $0x0c,%ah # text on - int $0x18 - mov $0x13,%ah # cursor home - xor %dx,%dx - int $0x18 - mov $0x11,%ah # cursor on - int $0x18 - - /* Setup keyboard */ - mov $0x03,%ah - int $0x18 - - /* Transfer PC-9801 system common area */ - xor %ax,%ax - mov %ax,%si - mov %ax,%ds - mov %ax,%di - mov $MEM_SYS,%ax - mov %ax,%es - mov $0x0600,%cx - rep - movsb - - /* Transfer EPSON machine type */ - mov $0xfd00,%ax - mov %ax,%ds - mov (0x804),%eax - and $0x00ffffff,%eax - mov %eax,%es:(EPSON_ID) - - /* Set machine type to PC98_SYSTEM_PARAMETER */ - call machine_check - - /* Load cdboot */ - xor %ax,%ax - mov %ax,%ds - mov $0x06,%ah /* Read data */ - mov (DAUA),%al /* Read drive */ - pop %ecx /* cylinder */ - xor %dx,%dx /* head / sector */ - mov $LOAD_SEG,%bx /* Load address */ - mov %bx,%es - xor %bp,%bp - mov $LOAD_SIZE,%bx /* Load size */ - int $0x1b - mov $msg_readerr,%si - jc error - - /* Jump to cdboot */ - ljmp $LOAD_SEG,$cdboot - -# -# Set machine type to PC98_SYSTEM_PARAMETER. -# -machine_check: xor %edx,%edx - mov %dx,%ds - mov $MEM_SYS,%ax - mov %ax,%es - - /* Wait V-SYNC */ -vsync.1: inb $0x60,%al - test $0x20,%al - jnz vsync.1 -vsync.2: inb $0x60,%al - test $0x20,%al - jz vsync.2 - - /* ANK 'A' font */ - xor %al,%al - outb %al,$0xa1 - mov $0x41,%al - outb %al,$0xa3 - - /* Get 'A' font from CG window */ - push %ds - mov $0xa400,%ax - mov %ax,%ds - xor %eax,%eax - xor %bx,%bx - mov $4,%cx -font.1: add (%bx),%eax - add $4,%bx - loop font.1 - pop %ds - cmp $0x6efc58fc,%eax - jnz m_epson - -m_pc98: or $M_NEC_PC98,%edx - mov $0x0458,%bx - mov (%bx),%al - test $0x80,%al - jz m_not_h98 - or $M_H98,%edx - jmp 1f -m_epson: or $M_EPSON_PC98,%edx -m_not_h98: or $M_NOT_H98,%edx - -1: inb $0x42,%al - test $0x20,%al - jz 1f - or $M_8M,%edx - -1: mov $0x0400,%bx - mov (%bx),%al - test $0x80,%al - jz 1f - or $M_NOTE,%edx - -1: mov $PC98_MACHINE_TYPE,%bx - mov %edx,%es:(%bx) - ret - -# -# Print out the error message at [SI], wait for a keypress, and then -# reboot the machine. -# -error: call putstr - mov $msg_keypress,%si - call putstr - xor %ax,%ax # Get keypress - int $0x18 - xor %ax,%ax # CPU reset - outb %al,$0xf0 -halt: hlt - jmp halt # Spin - -# -# Display a null-terminated string at [SI]. -# -# Trashes: AX, BX, CX, DX, SI, DI -# -putstr: push %ds - push %es - mov %cs,%ax - mov %ax,%ds - mov $0xa000,%ax - mov %ax,%es - mov cursor,%di - mov $0x00e1,%bx # Attribute - mov $160,%cx -putstr.0: lodsb - testb %al,%al - jz putstr.done - cmp $0x0d,%al - jz putstr.cr - cmp $0x0a,%al - jz putstr.lf - mov %bl,%es:0x2000(%di) - stosb - inc %di - jmp putstr.move -putstr.cr: xor %dx,%dx - mov %di,%ax - div %cx - sub %dx,%di - jmp putstr.move -putstr.lf: add %cx,%di -putstr.move: mov %di,%dx - mov $0x13,%ah # Move cursor - int $0x18 - jmp putstr.0 -putstr.done: mov %di,cursor - pop %es - pop %ds - ret - -# -# Display a single char at [AL], but don't move a cursor. -# -putc: push %es - push %di - push %bx - mov $0xa000,%bx - mov %bx,%es - mov cursor,%di - mov $0xe1,%bl # Attribute - mov %bl,%es:0x2000(%di) - stosb - pop %bx - pop %di - pop %es - ret - -msg_readerr: .asciz "Read Error\r\n" -msg_keypress: .asciz "\r\nPress any key to reboot\r\n" - -/* Boot signature */ - - .org SIG1_OFF,0x90 - - .word 0xaa55 # Magic number - -# -# cdboot -# -cdboot: mov %cs,%ax - mov %ax,%ds - xor %ax,%ax - mov %ax,%es - mov %es:(DAUA),%al # Save BIOS boot device - mov %al,drive - mov %cx,cylinder # Save BIOS boot cylinder - - mov $msg_welcome,%si # %ds:(%si) -> welcome message - call putstr # display the welcome message -# -# Setup the arguments that the loader is expecting from boot[12] -# - mov $msg_bootinfo,%si # %ds:(%si) -> boot args message - call putstr # display the message - mov $MEM_ARG,%bx # %ds:(%bx) -> boot args - mov %bx,%di # %es:(%di) -> boot args - xor %eax,%eax # zero %eax - mov $(MEM_ARG_SIZE/4),%cx # Size of arguments in 32-bit - # dwords - rep # Clear the arguments - stosl # to zero - mov drive,%dl # Store BIOS boot device - mov %dl,%es:0x4(%bx) # in kargs->bootdev - or $KARGS_FLAGS_CD,%es:0x8(%bx) # kargs->bootflags |= - # KARGS_FLAGS_CD -# -# Load Volume Descriptor -# - mov $VOLDESC_LBA,%eax # Set LBA of first VD -load_vd: push %eax # Save %eax - mov $1,%dh # One sector - mov $MEM_VOLDESC,%ebx # Destination - call read # Read it in - cmpb $VD_PRIMARY,%es:(%bx) # Primary VD? - je have_vd # Yes - pop %eax # Prepare to - inc %eax # try next - cmpb $VD_END,%es:(%bx) # Last VD? - jne load_vd # No, read next - mov $msg_novd,%si # No VD - jmp error # Halt -have_vd: # Have Primary VD -# -# Try to look up the loader binary using the paths in the loader_paths -# array. -# - mov $loader_paths,%si # Point to start of array -lookup_path: push %si # Save file name pointer - call lookup # Try to find file - pop %di # Restore file name pointer - jnc lookup_found # Found this file - push %es - mov %cs,%ax - mov %ax,%es - xor %al,%al # Look for next - mov $0xffff,%cx # path name by - repnz # scanning for - scasb # nul char - pop %es - mov %di,%si # Point %si at next path - mov (%si),%al # Get first char of next path - or %al,%al # Is it double nul? - jnz lookup_path # No, try it. - mov $msg_failed,%si # Failed message - jmp error # Halt -lookup_found: # Found a loader file -# -# Load the binary into the buffer. Due to real mode addressing limitations -# we have to read it in 64k chunks. -# - mov %es:DIR_SIZE(%bx),%eax # Read file length - add $SECTOR_SIZE-1,%eax # Convert length to sectors - shr $SECTOR_SHIFT,%eax - cmp $BUFFER_LEN,%eax - jbe load_sizeok - mov $msg_load2big,%si # Error message - jmp error -load_sizeok: movzbw %al,%cx # Num sectors to read - mov %es:DIR_EXTENT(%bx),%eax # Load extent - xor %edx,%edx - mov %es:DIR_EA_LEN(%bx),%dl - add %edx,%eax # Skip extended - mov $MEM_READ_BUFFER,%ebx # Read into the buffer -load_loop: mov %cl,%dh - cmp $MAX_READ_SEC,%cl # Truncate to max read size - jbe load_notrunc - mov $MAX_READ_SEC,%dh -load_notrunc: sub %dh,%cl # Update count - push %eax # Save - call read # Read it in - pop %eax # Restore - add $MAX_READ_SEC,%eax # Update LBA - add $MAX_READ,%ebx # Update dest addr - jcxz load_done # Done? - jmp load_loop # Keep going -load_done: -# -# Turn on the A20 address line -# - xor %ax,%ax # Turn A20 on - outb %al,$0xf2 - mov $0x02,%al - outb %al,$0xf6 -# -# Relocate the loader and BTX using a very lazy protected mode -# - mov $msg_relocate,%si # Display the - call putstr # relocation message - mov %es:(MEM_READ_BUFFER+AOUT_ENTRY),%edi # %edi is the destination - mov $(MEM_READ_BUFFER+AOUT_HEADER),%esi # %esi is - # the start of the text - # segment - mov %es:(MEM_READ_BUFFER+AOUT_TEXT),%ecx # %ecx = length of the text - # segment - push %edi # Save entry point for later - lgdt gdtdesc # setup our own gdt - cli # turn off interrupts - mov %cr0,%eax # Turn on - or $0x1,%al # protected - mov %eax,%cr0 # mode - ljmp $SEL_SCODE,$pm_start # long jump to clear the - # instruction pre-fetch queue - .code32 -pm_start: mov $SEL_SDATA,%ax # Initialize - mov %ax,%ds # %ds and - mov %ax,%es # %es to a flat selector - rep # Relocate the - movsb # text segment - add $(MEM_PAGE_SIZE - 1),%edi # pad %edi out to a new page - and $~(MEM_PAGE_SIZE - 1),%edi # for the data segment - mov MEM_READ_BUFFER+AOUT_DATA,%ecx # size of the data segment - rep # Relocate the - movsb # data segment - mov MEM_READ_BUFFER+AOUT_BSS,%ecx # size of the bss - xor %eax,%eax # zero %eax - add $3,%cl # round %ecx up to - shr $2,%ecx # a multiple of 4 - rep # zero the - stosl # bss - mov MEM_READ_BUFFER+AOUT_ENTRY,%esi # %esi -> relocated loader - add $MEM_BTX_OFFSET,%esi # %esi -> BTX in the loader - mov $MEM_BTX_ADDRESS,%edi # %edi -> where BTX needs to go - movzwl 0xa(%esi),%ecx # %ecx -> length of BTX - rep # Relocate - movsb # BTX - ljmp $SEL_SCODE16,$pm_16 # Jump to 16-bit PM - .code16 -pm_16: mov $SEL_RDATA,%ax # Initialize - mov %ax,%ds # %ds and - mov %ax,%es # %es to a real mode selector - mov %cr0,%eax # Turn off - and $~0x1,%al # protected - mov %eax,%cr0 # mode - ljmp $LOAD_SEG,$pm_end # Long jump to clear the - # instruction pre-fetch queue -pm_end: sti # Turn interrupts back on now -# -# Copy the BTX client to MEM_BTX_CLIENT -# - mov %cs,%ax - mov %ax,%ds - xor %ax,%ax - mov %ax,%es - mov $MEM_BTX_CLIENT,%di # Prepare to relocate - mov $btx_client,%si # the simple btx client - mov $(btx_client_end-btx_client),%cx # length of btx client - rep # Relocate the - movsb # simple BTX client -# -# Copy the boot[12] args to where the BTX client can see them -# - xor %ax,%ax - mov %ax,%ds - mov $MEM_ARG,%si # where the args are at now - mov $MEM_ARG_BTX,%di # where the args are moving to - mov $(MEM_ARG_SIZE/4),%cx # size of the arguments in longs - rep # Relocate - movsl # the words -# -# Save the entry point so the client can get to it later on -# - pop %eax # Restore saved entry point - stosl # and add it to the end of - # the arguments -# -# Now we just start up BTX and let it do the rest -# - mov $msg_jump,%si # Display the - call putstr # jump message - ljmp $0,$MEM_BTX_ENTRY # Jump to the BTX entry point - -# -# Lookup the file in the path at [SI] from the root directory. -# -# Trashes: All but BX -# Returns: CF = 0 (success), BX = pointer to record -# CF = 1 (not found) -# -lookup: mov $VD_ROOTDIR+MEM_VOLDESC,%bx # Root directory record - push %bx - push %si - mov $msg_lookup,%si # Display lookup message - call putstr - pop %si - push %si - call putstr - mov $msg_lookup2,%si - call putstr - pop %si - pop %bx -lookup_dir: lodsb # Get first char of path - cmp $0,%al # Are we done? - je lookup_done # Yes - cmp $'/',%al # Skip path separator. - je lookup_dir - dec %si # Undo lodsb side effect - call find_file # Lookup first path item - jnc lookup_dir # Try next component - mov $msg_lookupfail,%si # Not found message - push %bx - call putstr - pop %bx - stc # Set carry - ret -lookup_done: mov $msg_lookupok,%si # Success message - push %bx - call putstr - pop %bx - clc # Clear carry - ret - -# -# Lookup file at [SI] in directory whose record is at [BX]. -# -# Trashes: All but returns -# Returns: CF = 0 (success), BX = pointer to record, SI = next path item -# CF = 1 (not found), SI = preserved -# -find_file: mov %es:DIR_EXTENT(%bx),%eax # Load extent - xor %edx,%edx - mov %es:DIR_EA_LEN(%bx),%dl - add %edx,%eax # Skip extended attributes - mov %eax,rec_lba # Save LBA - mov %es:DIR_SIZE(%bx),%eax # Save size - mov %eax,rec_size - xor %cl,%cl # Zero length - push %si # Save -ff.namelen: inc %cl # Update length - lodsb # Read char - cmp $0,%al # Nul? - je ff.namedone # Yes - cmp $'/',%al # Path separator? - jnz ff.namelen # No, keep going -ff.namedone: dec %cl # Adjust length and save - mov %cl,name_len - pop %si # Restore -ff.load: mov rec_lba,%eax # Load LBA - mov $MEM_DIR,%ebx # Address buffer - mov $1,%dh # One sector - call read # Read directory block - incl rec_lba # Update LBA to next block -ff.scan: mov %ebx,%edx # Check for EOF - sub $MEM_DIR,%edx - cmp %edx,rec_size - ja ff.scan.1 - stc # EOF reached - ret -ff.scan.1: cmpb $0,%es:DIR_LEN(%bx) # Last record in block? - je ff.nextblock - push %si # Save - movzbw %es:DIR_NAMELEN(%bx),%si # Find end of string -ff.checkver: cmpb $'0',%es:DIR_NAME-1(%bx,%si) # Less than '0'? - jb ff.checkver.1 - cmpb $'9',%es:DIR_NAME-1(%bx,%si) # Greater than '9'? - ja ff.checkver.1 - dec %si # Next char - jnz ff.checkver - jmp ff.checklen # All numbers in name, so - # no version -ff.checkver.1: movzbw %es:DIR_NAMELEN(%bx),%cx - cmp %cx,%si # Did we find any digits? - je ff.checkdot # No - cmpb $';',%es:DIR_NAME-1(%bx,%si) # Check for semicolon - jne ff.checkver.2 - dec %si # Skip semicolon - mov %si,%cx - mov %cl,%es:DIR_NAMELEN(%bx) # Adjust length - jmp ff.checkdot -ff.checkver.2: mov %cx,%si # Restore %si to end of string -ff.checkdot: cmpb $'.',%es:DIR_NAME-1(%bx,%si) # Trailing dot? - jne ff.checklen # No - decb %es:DIR_NAMELEN(%bx) # Adjust length -ff.checklen: pop %si # Restore - movzbw name_len,%cx # Load length of name - cmp %cl,%es:DIR_NAMELEN(%bx) # Does length match? - je ff.checkname # Yes, check name -ff.nextrec: add %es:DIR_LEN(%bx),%bl # Next record - adc $0,%bh - jmp ff.scan -ff.nextblock: subl $SECTOR_SIZE,rec_size # Adjust size - jnc ff.load # If subtract ok, keep going - ret # End of file, so not found -ff.checkname: lea DIR_NAME(%bx),%di # Address name in record - push %si # Save - repe cmpsb # Compare name - je ff.match # We have a winner! - pop %si # Restore - jmp ff.nextrec # Keep looking. -ff.match: add $2,%sp # Discard saved %si - clc # Clear carry - ret - -# -# Load DH sectors starting at LBA EAX into [EBX]. -# -# Trashes: EAX -# -read: push %es # Save - push %bp - push %dx - push %cx - push %ebx - mov %bx,%bp # Set destination address - and $0x000f,%bp - shr $4,%ebx - mov %bx,%es - xor %bx,%bx # Set read bytes - mov %dh,%bl - shl $SECTOR_SHIFT,%bx # 2048 bytes/sec - mov %ax,%cx # Set LBA - shr $16,%eax - mov %ax,%dx -read.retry: mov $0x06,%ah # BIOS device read - mov drive,%al - and $0x7f,%al - call twiddle # Entertain the user - int $0x1b # Call BIOS - jc read.fail # Worked? - pop %ebx # Restore - pop %cx - pop %dx - pop %bp - pop %es - ret # Return -read.fail: cmp $ERROR_TIMEOUT,%ah # Timeout? - je read.retry # Yes, Retry. -read.error: mov %ah,%al # Save error - mov $hex_error,%di # Format it - call hex8 # as hex - mov $msg_badread,%si # Display Read error message - jmp error - -# -# Output the "twiddle" -# -twiddle: push %ax # Save - push %bx # Save - mov twiddle_index,%al # Load index - mov $twiddle_chars,%bx # Address table - inc %al # Next - and $3,%al # char - mov %al,twiddle_index # Save index for next call - xlat # Get char - call putc # Output it - pop %bx # Restore - pop %ax # Restore - ret - -# -# Convert AL to hex, saving the result to [EDI]. -# -hex8: pushl %eax # Save - shrb $0x4,%al # Do upper - call hex8.1 # 4 - popl %eax # Restore -hex8.1: andb $0xf,%al # Get lower 4 - cmpb $0xa,%al # Convert - sbbb $0x69,%al # to hex - das # digit - orb $0x20,%al # To lower case - mov %al,(%di) # Save char - inc %di - ret # (Recursive) - -# -# BTX client to start btxldr -# - .code32 -btx_client: mov $(MEM_ARG_BTX-MEM_BTX_CLIENT+MEM_ARG_SIZE-4), %esi - # %ds:(%esi) -> end - # of boot[12] args - mov $(MEM_ARG_SIZE/4),%ecx # Number of words to push - std # Go backwards -push_arg: lodsl # Read argument - push %eax # Push it onto the stack - loop push_arg # Push all of the arguments - cld # In case anyone depends on this - pushl MEM_ARG_BTX-MEM_BTX_CLIENT+MEM_ARG_SIZE # Entry point of - # the loader - push %eax # Emulate a near call - mov $0x1,%eax # 'exec' system call - int $INT_SYS # BTX system call -btx_client_end: - .code16 - - .p2align 4 -# -# Global descriptor table. -# -gdt: .word 0x0,0x0,0x0,0x0 # Null entry - .word 0xffff,0x0000,0x9200,0x00cf # SEL_SDATA - .word 0xffff,0x0000,0x9200,0x0000 # SEL_RDATA - .word 0xffff,LOAD_SEG<<4,0x9a00,0x00cf # SEL_SCODE (32-bit) - .word 0xffff,LOAD_SEG<<4,0x9a00,0x008f # SEL_SCODE16 (16-bit) -gdt.1: -# -# Pseudo-descriptors. -# -gdtdesc: .word gdt.1-gdt-1 # Limit - .long LOAD_SEG<<4 + gdt # Base - -# -# BOOT device -# -drive: .byte 0 -cylinder: .word 0 - -# -# State for searching dir -# -rec_lba: .long 0x0 # LBA (adjusted for EA) -rec_size: .long 0x0 # File size -name_len: .byte 0x0 # Length of current name - -cursor: .word 0 -twiddle_index: .byte 0x0 - -msg_welcome: .asciz "CD Loader 1.2\r\n\n" -msg_bootinfo: .asciz "Building the boot loader arguments\r\n" -msg_relocate: .asciz "Relocating the loader and the BTX\r\n" -msg_jump: .asciz "Starting the BTX loader\r\n" -msg_badread: .ascii "Read Error: 0x" -hex_error: .asciz "00\r\n" -msg_novd: .asciz "Could not find Primary Volume Descriptor\r\n" -msg_lookup: .asciz "Looking up " -msg_lookup2: .asciz "... " -msg_lookupok: .asciz "Found\r\n" -msg_lookupfail: .asciz "File not found\r\n" -msg_load2big: .asciz "File too big\r\n" -msg_failed: .asciz "Boot failed\r\n" -twiddle_chars: .ascii "|/-\\" -loader_paths: .asciz "/BOOT.PC98/LOADER" - .asciz "/boot.pc98/loader" - .asciz "/BOOT/LOADER" - .asciz "/boot/loader" - .byte 0 - -/* Boot signature */ - - .org SIG2_OFF,0x90 - - .word 0xaa55 # Magic number diff --git a/sys/boot/pc98/kgzldr/Makefile b/sys/boot/pc98/kgzldr/Makefile deleted file mode 100644 index 0070d70204a5..000000000000 --- a/sys/boot/pc98/kgzldr/Makefile +++ /dev/null @@ -1,20 +0,0 @@ -# $FreeBSD$ - -PROG= kgzldr.o -STRIP= -BINMODE=${LIBMODE} -BINDIR= ${LIBDIR} -MAN= - -SRCS= start.s boot.c inflate.c lib.c crt.s sio.s -CFLAGS= -Os -CFLAGS+=-DKZIP -NO_SHARED= -LDFLAGS=-Wl,-r -.PATH: ${.CURDIR}/../../../kern -.PATH: ${.CURDIR}/../../i386/kgzldr - -BOOT_COMCONSOLE_PORT?= 0x238 -AFLAGS+=--defsym SIO_PRT=${BOOT_COMCONSOLE_PORT} - -.include <bsd.prog.mk> diff --git a/sys/boot/pc98/kgzldr/crt.s b/sys/boot/pc98/kgzldr/crt.s deleted file mode 100644 index 35c1fc2dfe73..000000000000 --- a/sys/boot/pc98/kgzldr/crt.s +++ /dev/null @@ -1,89 +0,0 @@ -# -# Copyright (c) 1999 Global Technology Associates, Inc. -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions -# are met: -# 1. Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# 2. Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. -# -# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS``AS IS'' AND -# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS -# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, -# OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT -# OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -# BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, -# EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# -# From: btx.s 1.10 1999/02/25 16:27:41 rnordier -# $FreeBSD$ -# - -# Screen defaults and assumptions. - - .set SCR_MAT,0xe1 # Mode/attribute - .set SCR_COL,0x50 # Columns per row - .set SCR_ROW,0x19 # Rows per screen - -# BIOS Data Area locations. - - .set BDA_POS,0x53e # Cursor position - - .globl crt_putchr - -# void crt_putchr(int c) - -crt_putchr: movb 0x4(%esp,1),%al # Get character - pusha # Save - xorl %ecx,%ecx # Zero for loops - movb $SCR_MAT,%ah # Mode/attribute - movl $BDA_POS,%ebx # BDA pointer - movw (%ebx),%dx # Cursor position - movl $0xa0000,%edi -crt_putchr.1: cmpb $0xa,%al # New line? - je crt_putchr.2 # Yes - movw %dx,%cx - movb %al,(%edi,%ecx,1) # Write char - addl $0x2000,%ecx - movb %ah,(%edi,%ecx,1) # Write attr - addw $0x02,%dx - jmp crt_putchr.3 -crt_putchr.2: movw %dx,%ax - movb $SCR_COL*2,%dl - div %dl - incb %al - mul %dl - movw %ax,%dx -crt_putchr.3: cmpw $SCR_ROW*SCR_COL*2,%dx - jb crt_putchr.4 # No - leal 2*SCR_COL(%edi),%esi # New top line - movw $(SCR_ROW-1)*SCR_COL/2,%cx # Words to move - rep # Scroll - movsl # screen - movb $' ',%al # Space - xorb %ah,%ah - movb $SCR_COL,%cl # Columns to clear - rep # Clear - stosw # line - movw $(SCR_ROW-1)*SCR_COL*2,%dx -crt_putchr.4: movw %dx,(%ebx) # Update position - shrw $1,%dx -crt_putchr.5: inb $0x60,%al # Move cursor - testb $0x04,%al - jz crt_putchr.5 - movb $0x49,%al - outb %al,$0x62 - movb %dl,%al - outb %al,$0x60 - movb %dh,%al - outb %al,$0x60 - popa # Restore - ret # To caller diff --git a/sys/boot/pc98/libpc98/Makefile b/sys/boot/pc98/libpc98/Makefile deleted file mode 100644 index f3e27a4c679d..000000000000 --- a/sys/boot/pc98/libpc98/Makefile +++ /dev/null @@ -1,51 +0,0 @@ -# $FreeBSD$ -# -LIB= pc98 -INTERNALLIB= - -.PATH: ${.CURDIR}/../../i386/libi386 - -SRCS= bioscd.c biosdisk.c biosmem.c biospnp.c \ - biospci.c biossmap.c bootinfo.c bootinfo32.c \ - comconsole.c devicename.c elf32_freebsd.c \ - i386_copy.c i386_module.c nullconsole.c pc98_sys.c pxe.c pxetramp.s \ - time.c vidconsole.c -.PATH: ${.CURDIR}/../../zfs -SRCS+= devicename_stubs.c - -# Enable PXE TFTP or NFS support, not both. -.if defined(LOADER_TFTP_SUPPORT) -CFLAGS+= -DLOADER_TFTP_SUPPORT -.else -CFLAGS+= -DLOADER_NFS_SUPPORT -.endif - -BOOT_COMCONSOLE_PORT?= 0x238 -CFLAGS+= -DCOMPORT=${BOOT_COMCONSOLE_PORT} - -BOOT_COMCONSOLE_SPEED?= 9600 -CFLAGS+= -DCOMSPEED=${BOOT_COMCONSOLE_SPEED} - -.ifdef(BOOT_BIOSDISK_DEBUG) -# Make the disk code more talkative -CFLAGS+= -DDISK_DEBUG -.endif - -# Include simple terminal emulation (cons25-compatible) -CFLAGS+= -DTERM_EMU - -# XXX: make alloca() useable -CFLAGS+= -Dalloca=__builtin_alloca - -CFLAGS+= -I${.CURDIR}/../../ficl -I${.CURDIR}/../../ficl/i386 \ - -I${.CURDIR}/../../common \ - -I${.CURDIR}/../btx/lib \ - -I${.CURDIR}/../../i386/libi386 \ - -I${.CURDIR}/../../.. -I. -# the location of libstand -CFLAGS+= -I${.CURDIR}/../../../../lib/libstand/ - -# Handle FreeBSD specific %b and %D printf format specifiers -CFLAGS+= ${FORMAT_EXTENSIONS} - -.include <bsd.lib.mk> diff --git a/sys/boot/pc98/libpc98/bioscd.c b/sys/boot/pc98/libpc98/bioscd.c deleted file mode 100644 index f259701f91e0..000000000000 --- a/sys/boot/pc98/libpc98/bioscd.c +++ /dev/null @@ -1,420 +0,0 @@ -/*- - * Copyright (c) 1998 Michael Smith <msmith@freebsd.org> - * Copyright (c) 2001 John H. Baldwin <jhb@FreeBSD.org> - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -/* - * BIOS CD device handling for CD's that have been booted off of via no - * emulation booting as defined in the El Torito standard. - * - * Ideas and algorithms from: - * - * - FreeBSD libi386/biosdisk.c - * - */ - -#include <stand.h> - -#include <sys/param.h> -#include <machine/bootinfo.h> - -#include <stdarg.h> - -#include <bootstrap.h> -#include <btxv86.h> -#include "libi386.h" - -#define BIOSCD_SECSIZE 2048 -#define BUFSIZE (1 * BIOSCD_SECSIZE) -#define MAXBCDEV 1 - -/* Major numbers for devices we frontend for. */ -#define ACDMAJOR 117 -#define CDMAJOR 15 - -#ifdef DISK_DEBUG -# define DEBUG(fmt, args...) printf("%s: " fmt "\n" , __func__ , ## args) -#else -# define DEBUG(fmt, args...) -#endif - -struct specification_packet { - u_char sp_size; - u_char sp_bootmedia; - u_char sp_drive; - u_char sp_controller; - u_int sp_lba; - u_short sp_devicespec; - u_short sp_buffersegment; - u_short sp_loadsegment; - u_short sp_sectorcount; - u_short sp_cylsec; - u_char sp_head; -}; - -/* - * List of BIOS devices, translation from disk unit number to - * BIOS unit number. - */ -static struct bcinfo { - int bc_unit; /* BIOS unit number */ - struct specification_packet bc_sp; - int bc_open; /* reference counter */ - void *bc_bcache; /* buffer cache data */ -} bcinfo [MAXBCDEV]; -static int nbcinfo = 0; - -#define BC(dev) (bcinfo[(dev)->d_unit]) - -static int bc_read(int unit, daddr_t dblk, int blks, caddr_t dest); -static int bc_init(void); -static int bc_strategy(void *devdata, int flag, daddr_t dblk, - size_t size, char *buf, size_t *rsize); -static int bc_realstrategy(void *devdata, int flag, daddr_t dblk, - size_t size, char *buf, size_t *rsize); -static int bc_open(struct open_file *f, ...); -static int bc_close(struct open_file *f); -static int bc_print(int verbose); - -struct devsw bioscd = { - "cd", - DEVT_CD, - bc_init, - bc_strategy, - bc_open, - bc_close, - noioctl, - bc_print, - NULL -}; - -/* - * Translate between BIOS device numbers and our private unit numbers. - */ -int -bc_bios2unit(int biosdev) -{ - int i; - - DEBUG("looking for bios device 0x%x", biosdev); - for (i = 0; i < nbcinfo; i++) { - DEBUG("bc unit %d is BIOS device 0x%x", i, bcinfo[i].bc_unit); - if (bcinfo[i].bc_unit == biosdev) - return(i); - } - return(-1); -} - -int -bc_unit2bios(int unit) -{ - if ((unit >= 0) && (unit < nbcinfo)) - return(bcinfo[unit].bc_unit); - return(-1); -} - -/* - * We can't quiz, we have to be told what device to use, so this functoin - * doesn't do anything. Instead, the loader calls bc_add() with the BIOS - * device number to add. - */ -static int -bc_init(void) -{ - - return (0); -} - -int -bc_add(int biosdev) -{ - - if (nbcinfo >= MAXBCDEV) - return (-1); - bcinfo[nbcinfo].bc_unit = biosdev; - - /* SCSI CD-ROM only */ - if ((biosdev & 0xf0) != 0xa0) - return (-1); - if ((((uint32_t *)PTOV(0xA1460))[biosdev & 0x0f] & 0x1f) != 5) - return (-1); - - printf("BIOS CD is cd%d\n", nbcinfo); - nbcinfo++; - bcache_add_dev(nbcinfo); /* register cd device in bcache */ - return(0); -} - -/* - * Print information about disks - */ -static int -bc_print(int verbose) -{ - char line[80]; - int i, ret = 0; - - if (nbcinfo == 0) - return (0); - - printf("%s devices:", bioscd.dv_name); - if ((ret = pager_output("\n")) != 0) - return (ret); - - for (i = 0; i < nbcinfo; i++) { - sprintf(line, " cd%d: Device 0x%x\n", i, - bcinfo[i].bc_sp.sp_devicespec); - if ((ret = pager_output(line)) != 0) - break; - } - return (ret); -} - -/* - * Attempt to open the disk described by (dev) for use by (f). - */ -static int -bc_open(struct open_file *f, ...) -{ - va_list ap; - struct i386_devdesc *dev; - - va_start(ap, f); - dev = va_arg(ap, struct i386_devdesc *); - va_end(ap); - if (dev->d_unit >= nbcinfo) { - DEBUG("attempt to open nonexistent disk"); - return(ENXIO); - } - - BC(dev).bc_open++; - if (BC(dev).bc_bcache == NULL) - BC(dev).bc_bcache = bcache_allocate(); - return(0); -} - -static int -bc_close(struct open_file *f) -{ - struct i386_devdesc *dev; - - dev = (struct i386_devdesc *)f->f_devdata; - BC(dev).bc_open--; - if (BC(dev).bc_open == 0) { - bcache_free(BC(dev).bc_bcache); - BC(dev).bc_bcache = NULL; - } - return(0); -} - -static int -bc_strategy(void *devdata, int rw, daddr_t dblk, size_t size, - char *buf, size_t *rsize) -{ - struct bcache_devdata bcd; - struct i386_devdesc *dev; - - dev = (struct i386_devdesc *)devdata; - bcd.dv_strategy = bc_realstrategy; - bcd.dv_devdata = devdata; - bcd.dv_cache = BC(dev).bc_bcache; - - return (bcache_strategy(&bcd, rw, dblk, size, buf, rsize)); -} - -static int -bc_realstrategy(void *devdata, int rw, daddr_t dblk, size_t size, - char *buf, size_t *rsize) -{ - struct i386_devdesc *dev; - int unit; - int blks; -#ifdef BD_SUPPORT_FRAGS - char fragbuf[BIOSCD_SECSIZE]; - size_t fragsize; - - fragsize = size % BIOSCD_SECSIZE; -#else - if (size % BIOSCD_SECSIZE) - return (EINVAL); -#endif - - if (rw != F_READ) - return(EROFS); - dev = (struct i386_devdesc *)devdata; - unit = dev->d_unit; - blks = size / BIOSCD_SECSIZE; - if (dblk % (BIOSCD_SECSIZE / DEV_BSIZE) != 0) - return (EINVAL); - dblk /= (BIOSCD_SECSIZE / DEV_BSIZE); - DEBUG("read %d from %lld to %p", blks, dblk, buf); - - if (rsize) - *rsize = 0; - if (blks && bc_read(unit, dblk, blks, buf)) { - DEBUG("read error"); - return (EIO); - } -#ifdef BD_SUPPORT_FRAGS - DEBUG("frag read %d from %lld+%d to %p", - fragsize, dblk, blks, buf + (blks * BIOSCD_SECSIZE)); - if (fragsize && bc_read(unit, dblk + blks, 1, fragbuf)) { - DEBUG("frag read error"); - return(EIO); - } - bcopy(fragbuf, buf + (blks * BIOSCD_SECSIZE), fragsize); -#endif - if (rsize) - *rsize = size; - return (0); -} - -/* Max number of sectors to bounce-buffer at a time. */ -#define CD_BOUNCEBUF 8 - -static int -bc_read(int unit, daddr_t dblk, int blks, caddr_t dest) -{ - u_int maxfer, resid, result, retry, x; - caddr_t bbuf, p, xp; - int biosdev; -#ifdef DISK_DEBUG - int error; -#endif - - /* Just in case some idiot actually tries to read -1 blocks... */ - if (blks < 0) - return (-1); - - /* If nothing to do, just return succcess. */ - if (blks == 0) - return (0); - - /* Decide whether we have to bounce */ - if (VTOP(dest) >> 20 != 0) { - /* - * The destination buffer is above first 1MB of - * physical memory so we have to arrange a suitable - * bounce buffer. - */ - x = min(CD_BOUNCEBUF, (unsigned)blks); - bbuf = alloca(x * BIOSCD_SECSIZE); - maxfer = x; - } else { - bbuf = NULL; - maxfer = 0; - } - - biosdev = bc_unit2bios(unit); - resid = blks; - p = dest; - - while (resid > 0) { - if (bbuf) - xp = bbuf; - else - xp = p; - x = resid; - if (maxfer > 0) - x = min(x, maxfer); - - /* - * Loop retrying the operation a couple of times. The BIOS - * may also retry. - */ - for (retry = 0; retry < 3; retry++) { - /* If retrying, reset the drive */ - if (retry > 0) { - v86.ctl = V86_FLAGS; - v86.addr = 0x1b; - v86.eax = 0x0300 | biosdev; - v86int(); - } - - v86.ctl = V86_FLAGS; - v86.addr = 0x1b; - v86.eax = 0x0600 | (biosdev & 0x7f); - v86.ebx = x * BIOSCD_SECSIZE; - v86.ecx = dblk & 0xffff; - v86.edx = (dblk >> 16) & 0xffff; - v86.ebp = VTOPOFF(xp); - v86.es = VTOPSEG(xp); - v86int(); - result = V86_CY(v86.efl); - if (result == 0) - break; - } - -#ifdef DISK_DEBUG - error = (v86.eax >> 8) & 0xff; -#endif - DEBUG("%d sectors from %lld to %p (0x%x) %s", x, dblk, p, - VTOP(p), result ? "failed" : "ok"); - DEBUG("unit %d status 0x%x", unit, error); - if (bbuf != NULL) - bcopy(bbuf, p, x * BIOSCD_SECSIZE); - p += (x * BIOSCD_SECSIZE); - dblk += x; - resid -= x; - } - -/* hexdump(dest, (blks * BIOSCD_SECSIZE)); */ - return(0); -} - -/* - * Return a suitable dev_t value for (dev). - */ -int -bc_getdev(struct i386_devdesc *dev) -{ - int biosdev, unit, device; - int major; - int rootdev; - - unit = dev->d_unit; - biosdev = bc_unit2bios(unit); - DEBUG("unit %d BIOS device %d", unit, biosdev); - if (biosdev == -1) /* not a BIOS device */ - return(-1); - - device = biosdev & 0xf0; - if (device == 0x80) - major = ACDMAJOR; - else if (device == 0xa0) - major = CDMAJOR; - else - return (-1); - - unit = 0; /* XXX */ - - /* XXX: Assume partition 'a'. */ - rootdev = MAKEBOOTDEV(major, 0, unit, 0); - DEBUG("dev is 0x%x\n", rootdev); - return(rootdev); -} diff --git a/sys/boot/pc98/libpc98/biosdisk.c b/sys/boot/pc98/libpc98/biosdisk.c deleted file mode 100644 index 86a550deeac8..000000000000 --- a/sys/boot/pc98/libpc98/biosdisk.c +++ /dev/null @@ -1,1120 +0,0 @@ -/*- - * Copyright (c) 1998 Michael Smith <msmith@freebsd.org> - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -/* - * BIOS disk device handling. - * - * Ideas and algorithms from: - * - * - NetBSD libi386/biosdisk.c - * - FreeBSD biosboot/disk.c - * - */ - -#include <stand.h> - -#include <sys/disklabel.h> -#include <sys/diskpc98.h> -#include <machine/bootinfo.h> - -#include <stdarg.h> - -#include <bootstrap.h> -#include <btxv86.h> -#include "libi386.h" - -#define BIOS_NUMDRIVES 0x475 -#define BIOSDISK_SECSIZE 512 -#define BUFSIZE (1 * BIOSDISK_SECSIZE) - -#define DT_ATAPI 0x10 /* disk type for ATAPI floppies */ -#define WDMAJOR 0 /* major numbers for devices we frontend for */ -#define WFDMAJOR 1 -#define FDMAJOR 2 -#define DAMAJOR 4 - -#ifdef DISK_DEBUG -# define DEBUG(fmt, args...) printf("%s: " fmt "\n" , __func__ , ## args) -#else -# define DEBUG(fmt, args...) -#endif - -struct open_disk { - int od_dkunit; /* disk unit number */ - int od_unit; /* BIOS unit number */ - int od_cyl; /* BIOS geometry */ - int od_hds; - int od_sec; - int od_boff; /* block offset from beginning of BIOS disk */ - int od_flags; -#define BD_MODEINT13 0x0000 -#define BD_MODEEDD1 0x0001 -#define BD_MODEEDD3 0x0002 -#define BD_MODEMASK 0x0003 -#define BD_FLOPPY 0x0004 -#define BD_LABELOK 0x0008 -#define BD_PARTTABOK 0x0010 -#define BD_OPTICAL 0x0020 - struct disklabel od_disklabel; - int od_nslices; /* slice count */ - struct pc98_partition od_slicetab[PC98_NPARTS]; -}; - -/* - * List of BIOS devices, translation from disk unit number to - * BIOS unit number. - */ -static struct bdinfo -{ - int bd_unit; /* BIOS unit number */ - int bd_flags; - int bd_type; /* BIOS 'drive type' (floppy only) */ - int bd_da_unit; /* kernel unit number for da */ - int bd_open; /* reference counter */ - void *bd_bcache; /* buffer cache data */ -} bdinfo [MAXBDDEV]; -static int nbdinfo = 0; - -#define BD(dev) (bdinfo[(dev)->d_unit]) - -static int bd_getgeom(struct open_disk *od); -static int bd_read(struct open_disk *od, daddr_t dblk, int blks, - caddr_t dest); -static int bd_write(struct open_disk *od, daddr_t dblk, int blks, - caddr_t dest); - -static int bd_int13probe(struct bdinfo *bd); - -static int bd_printslice(struct open_disk *od, struct pc98_partition *dp, - char *prefix, int verbose); -static int bd_printbsdslice(struct open_disk *od, daddr_t offset, - char *prefix, int verbose); - -static int bd_init(void); -static int bd_strategy(void *devdata, int flag, daddr_t dblk, - size_t size, char *buf, size_t *rsize); -static int bd_realstrategy(void *devdata, int flag, daddr_t dblk, - size_t size, char *buf, size_t *rsize); -static int bd_open(struct open_file *f, ...); -static int bd_close(struct open_file *f); -static int bd_print(int verbose); - -struct devsw biosdisk = { - "disk", - DEVT_DISK, - bd_init, - bd_strategy, - bd_open, - bd_close, - noioctl, - bd_print, - NULL -}; - -static int bd_opendisk(struct open_disk **odp, struct i386_devdesc *dev); -static void bd_closedisk(struct open_disk *od); -static int bd_open_pc98(struct open_disk *od, struct i386_devdesc *dev); -static int bd_bestslice(struct open_disk *od); -static void bd_checkextended(struct open_disk *od, int slicenum); - -/* - * Translate between BIOS device numbers and our private unit numbers. - */ -int -bd_bios2unit(int biosdev) -{ - int i; - - DEBUG("looking for bios device 0x%x", biosdev); - for (i = 0; i < nbdinfo; i++) { - DEBUG("bd unit %d is BIOS device 0x%x", i, bdinfo[i].bd_unit); - if (bdinfo[i].bd_unit == biosdev) - return(i); - } - return(-1); -} - -int -bd_unit2bios(int unit) -{ - if ((unit >= 0) && (unit < nbdinfo)) - return(bdinfo[unit].bd_unit); - return(-1); -} - -/* - * Quiz the BIOS for disk devices, save a little info about them. - */ -static int -bd_init(void) -{ - int base, unit; - int da_drive=0, n=-0x10; - - /* sequence 0x90, 0x80, 0xa0 */ - for (base = 0x90; base <= 0xa0; base += n, n += 0x30) { - for (unit = base; (nbdinfo < MAXBDDEV) || ((unit & 0x0f) < 4); unit++) { - bdinfo[nbdinfo].bd_open = 0; - bdinfo[nbdinfo].bd_bcache = NULL; - bdinfo[nbdinfo].bd_unit = unit; - bdinfo[nbdinfo].bd_flags = (unit & 0xf0) == 0x90 ? BD_FLOPPY : 0; - - if (!bd_int13probe(&bdinfo[nbdinfo])){ - if (((unit & 0xf0) == 0x90 && (unit & 0x0f) < 4) || - ((unit & 0xf0) == 0xa0 && (unit & 0x0f) < 6)) - continue; /* Target IDs are not contiguous. */ - else - break; - } - - if (bdinfo[nbdinfo].bd_flags & BD_FLOPPY){ - /* available 1.44MB access? */ - if (*(u_char *)PTOV(0xA15AE) & (1<<(unit & 0xf))) { - /* boot media 1.2MB FD? */ - if ((*(u_char *)PTOV(0xA1584) & 0xf0) != 0x90) - bdinfo[nbdinfo].bd_unit = 0x30 + (unit & 0xf); - } - } - else { - if ((unit & 0xF0) == 0xA0) /* SCSI HD or MO */ - bdinfo[nbdinfo].bd_da_unit = da_drive++; - } - /* XXX we need "disk aliases" to make this simpler */ - printf("BIOS drive %c: is disk%d\n", - 'A' + nbdinfo, nbdinfo); - nbdinfo++; - } - } - bcache_add_dev(nbdinfo); - return(0); -} - -/* - * Try to detect a device supported by the legacy int13 BIOS - */ -static int -bd_int13probe(struct bdinfo *bd) -{ - int addr; - - if (bd->bd_flags & BD_FLOPPY) { - addr = 0xa155c; - } else { - if ((bd->bd_unit & 0xf0) == 0x80) - addr = 0xa155d; - else - addr = 0xa1482; - } - if ( *(u_char *)PTOV(addr) & (1<<(bd->bd_unit & 0x0f))) { - bd->bd_flags |= BD_MODEINT13; - return(1); - } - if ((bd->bd_unit & 0xF0) == 0xA0) { - int media = ((unsigned *)PTOV(0xA1460))[bd->bd_unit & 0x0F] & 0x1F; - - if (media == 7) { /* MO */ - bd->bd_flags |= BD_MODEINT13 | BD_OPTICAL; - return(1); - } - } - return(0); -} - -/* - * Print information about disks - */ -static int -bd_print(int verbose) -{ - int i, j, ret = 0; - char line[80]; - struct i386_devdesc dev; - struct open_disk *od; - struct pc98_partition *dptr; - - if (nbdinfo == 0) - return (0); - - printf("%s devices:", biosdisk.dv_name); - if ((ret = pager_output("\n")) != 0) - return (ret); - - for (i = 0; i < nbdinfo; i++) { - snprintf(line, sizeof(line), " disk%d: BIOS drive %c:\n", - i, 'A' + i); - if ((ret = pager_output(line)) != 0) - break; - - /* try to open the whole disk */ - dev.d_unit = i; - dev.d_kind.biosdisk.slice = -1; - dev.d_kind.biosdisk.partition = -1; - - if (!bd_opendisk(&od, &dev)) { - - /* Do we have a partition table? */ - if (od->od_flags & BD_PARTTABOK) { - dptr = &od->od_slicetab[0]; - - /* Check for a "dedicated" disk */ - for (j = 0; j < od->od_nslices; j++) { - snprintf(line, sizeof(line), " disk%ds%d", i, j + 1); - if ((ret = bd_printslice(od, &dptr[j], line, verbose)) != 0) - break; - } - } - bd_closedisk(od); - if (ret != 0) - break; - } - } - return (ret); -} - -/* Given a size in 512 byte sectors, convert it to a human-readable number. */ -static char * -display_size(uint64_t size) -{ - static char buf[80]; - char unit; - - size /= 2; - unit = 'K'; - if (size >= 10485760000LL) { - size /= 1073741824; - unit = 'T'; - } else if (size >= 10240000) { - size /= 1048576; - unit = 'G'; - } else if (size >= 10000) { - size /= 1024; - unit = 'M'; - } - sprintf(buf, "%6ld%cB", (long)size, unit); - return (buf); -} - -/* - * Print information about slices on a disk. For the size calculations we - * assume a 512 byte sector. - */ -static int -bd_printslice(struct open_disk *od, struct pc98_partition *dp, char *prefix, - int verbose) -{ - int cylsecs, start, size; - char stats[80]; - char line[80]; - - cylsecs = od->od_hds * od->od_sec; - start = dp->dp_scyl * cylsecs + dp->dp_shd * od->od_sec + dp->dp_ssect; - size = (dp->dp_ecyl - dp->dp_scyl + 1) * cylsecs; - - if (verbose) - sprintf(stats, " %s (%d - %d)", display_size(size), - start, start + size); - else - stats[0] = '\0'; - - switch(dp->dp_mid & PC98_MID_MASK) { - case PC98_MID_386BSD: - return (bd_printbsdslice(od, start, prefix, verbose)); - case 0x00: /* unused partition */ - return (0); - case 0x01: - sprintf(line, "%s: FAT-12%s\n", prefix, stats); - break; - case 0x11: - case 0x20: - case 0x21: - case 0x22: - case 0x23: - case 0x24: - sprintf(line, "%s: FAT-16%s\n", prefix, stats); - break; - default: - sprintf(line, "%s: Unknown fs: 0x%x %s\n", prefix, dp->dp_mid, - stats); - } - return (pager_output(line)); -} - -/* - * Print out each valid partition in the disklabel of a FreeBSD slice. - * For size calculations, we assume a 512 byte sector size. - */ -static int -bd_printbsdslice(struct open_disk *od, daddr_t offset, char *prefix, - int verbose) -{ - char line[80]; - char buf[BIOSDISK_SECSIZE]; - struct disklabel *lp; - int i; - - /* read disklabel */ - if (bd_read(od, offset + LABELSECTOR, 1, buf)) - return (0); - lp =(struct disklabel *)(&buf[0]); - if (lp->d_magic != DISKMAGIC) { - sprintf(line, "%s: FFS bad disklabel\n", prefix); - return (pager_output(line)); - } - - /* Print partitions */ - for (i = 0; i < lp->d_npartitions; i++) { - /* - * For each partition, make sure we know what type of fs it is. If - * not, then skip it. However, since floppies often have bogus - * fstypes, print the 'a' partition on a floppy even if it is marked - * unused. - */ - if ((lp->d_partitions[i].p_fstype == FS_BSDFFS) || - (lp->d_partitions[i].p_fstype == FS_SWAP) || - (lp->d_partitions[i].p_fstype == FS_VINUM) || - ((lp->d_partitions[i].p_fstype == FS_UNUSED) && - (od->od_flags & BD_FLOPPY) && (i == 0))) { - - /* Only print out statistics in verbose mode */ - if (verbose) - sprintf(line, " %s%c: %s %s (%d - %d)\n", prefix, 'a' + i, - (lp->d_partitions[i].p_fstype == FS_SWAP) ? "swap " : - (lp->d_partitions[i].p_fstype == FS_VINUM) ? "vinum" : - "FFS ", - display_size(lp->d_partitions[i].p_size), - lp->d_partitions[i].p_offset, - lp->d_partitions[i].p_offset + lp->d_partitions[i].p_size); - else - sprintf(line, " %s%c: %s\n", prefix, 'a' + i, - (lp->d_partitions[i].p_fstype == FS_SWAP) ? "swap" : - (lp->d_partitions[i].p_fstype == FS_VINUM) ? "vinum" : - "FFS"); - if (pager_output(line)) - return (1); - } - } - return (0); -} - - -/* - * Attempt to open the disk described by (dev) for use by (f). - * - * Note that the philosophy here is "give them exactly what - * they ask for". This is necessary because being too "smart" - * about what the user might want leads to complications. - * (eg. given no slice or partition value, with a disk that is - * sliced - are they after the first BSD slice, or the DOS - * slice before it?) - */ -static int -bd_open(struct open_file *f, ...) -{ - va_list ap; - struct i386_devdesc *dev; - struct open_disk *od; - int error; - - va_start(ap, f); - dev = va_arg(ap, struct i386_devdesc *); - va_end(ap); - if ((error = bd_opendisk(&od, dev))) - return(error); - - BD(dev).bd_open++; - if (BD(dev).bd_bcache == NULL) - BD(dev).bd_bcache = bcache_allocate(); - - /* - * Save our context - */ - ((struct i386_devdesc *)(f->f_devdata))->d_kind.biosdisk.data = od; - DEBUG("open_disk %p, partition at 0x%x", od, od->od_boff); - return(0); -} - -static int -bd_opendisk(struct open_disk **odp, struct i386_devdesc *dev) -{ - struct open_disk *od; - int error; - - if (dev->d_unit >= nbdinfo) { - DEBUG("attempt to open nonexistent disk"); - return(ENXIO); - } - - od = (struct open_disk *)malloc(sizeof(struct open_disk)); - if (!od) { - DEBUG("no memory"); - return (ENOMEM); - } - - /* Look up BIOS unit number, intialise open_disk structure */ - od->od_dkunit = dev->d_unit; - od->od_unit = bdinfo[od->od_dkunit].bd_unit; - od->od_flags = bdinfo[od->od_dkunit].bd_flags; - od->od_boff = 0; - error = 0; - DEBUG("open '%s', unit 0x%x slice %d partition %d", - i386_fmtdev(dev), dev->d_unit, - dev->d_kind.biosdisk.slice, dev->d_kind.biosdisk.partition); - - /* Get geometry for this open (removable device may have changed) */ - if (bd_getgeom(od)) { - DEBUG("can't get geometry"); - error = ENXIO; - goto out; - } - - /* Determine disk layout. */ - error = bd_open_pc98(od, dev); - - out: - if (error) { - free(od); - } else { - *odp = od; /* return the open disk */ - } - return(error); -} - -static int -bd_open_pc98(struct open_disk *od, struct i386_devdesc *dev) -{ - struct pc98_partition *dptr; - struct disklabel *lp; - int sector, slice, i; - char buf[BUFSIZE]; - - /* - * Following calculations attempt to determine the correct value - * for d->od_boff by looking for the slice and partition specified, - * or searching for reasonable defaults. - */ - - /* - * Find the slice in the DOS slice table. - */ - od->od_nslices = 0; - if (od->od_flags & BD_FLOPPY) { - sector = 0; - goto unsliced; - } - if (bd_read(od, 0, 1, buf)) { - DEBUG("error reading MBR"); - return (EIO); - } - - /* - * Check the slice table magic. - */ - if (((u_char)buf[0x1fe] != 0x55) || ((u_char)buf[0x1ff] != 0xaa)) { - /* If a slice number was explicitly supplied, this is an error */ - if (dev->d_kind.biosdisk.slice > 0) { - DEBUG("no slice table/MBR (no magic)"); - return (ENOENT); - } - sector = 0; - goto unsliced; /* may be a floppy */ - } - if (bd_read(od, 1, 1, buf)) { - DEBUG("error reading MBR"); - return (EIO); - } - - /* - * copy the partition table, then pick up any extended partitions. - */ - bcopy(buf + PC98_PARTOFF, &od->od_slicetab, - sizeof(struct pc98_partition) * PC98_NPARTS); - od->od_nslices = PC98_NPARTS; /* extended slices start here */ - od->od_flags |= BD_PARTTABOK; - dptr = &od->od_slicetab[0]; - - /* Is this a request for the whole disk? */ - if (dev->d_kind.biosdisk.slice == -1) { - sector = 0; - goto unsliced; - } - - /* - * if a slice number was supplied but not found, this is an error. - */ - if (dev->d_kind.biosdisk.slice > 0) { - slice = dev->d_kind.biosdisk.slice - 1; - if (slice >= od->od_nslices) { - DEBUG("slice %d not found", slice); - return (ENOENT); - } - } - - /* Try to auto-detect the best slice; this should always give a slice number */ - if (dev->d_kind.biosdisk.slice == 0) { - slice = bd_bestslice(od); - if (slice == -1) { - return (ENOENT); - } - dev->d_kind.biosdisk.slice = slice; - } - - dptr = &od->od_slicetab[0]; - /* - * Accept the supplied slice number unequivocally (we may be looking - * at a DOS partition). - */ - dptr += (dev->d_kind.biosdisk.slice - 1); /* we number 1-4, offsets are 0-3 */ - sector = dptr->dp_scyl * od->od_hds * od->od_sec + - dptr->dp_shd * od->od_sec + dptr->dp_ssect; - { - int end = dptr->dp_ecyl * od->od_hds * od->od_sec + - dptr->dp_ehd * od->od_sec + dptr->dp_esect; - DEBUG("slice entry %d at %d, %d sectors", - dev->d_kind.biosdisk.slice - 1, sector, end-sector); - } - - /* - * If we are looking at a BSD slice, and the partition is < 0, assume the 'a' partition - */ - if ((dptr->dp_mid == DOSMID_386BSD) && (dev->d_kind.biosdisk.partition < 0)) - dev->d_kind.biosdisk.partition = 0; - - unsliced: - /* - * Now we have the slice offset, look for the partition in the disklabel if we have - * a partition to start with. - * - * XXX we might want to check the label checksum. - */ - if (dev->d_kind.biosdisk.partition < 0) { - od->od_boff = sector; /* no partition, must be after the slice */ - DEBUG("opening raw slice"); - } else { - - if (bd_read(od, sector + LABELSECTOR, 1, buf)) { - DEBUG("error reading disklabel"); - return (EIO); - } - DEBUG("copy %d bytes of label from %p to %p", sizeof(struct disklabel), buf + LABELOFFSET, &od->od_disklabel); - bcopy(buf + LABELOFFSET, &od->od_disklabel, sizeof(struct disklabel)); - lp = &od->od_disklabel; - od->od_flags |= BD_LABELOK; - - if (lp->d_magic != DISKMAGIC) { - DEBUG("no disklabel"); - return (ENOENT); - } - if (dev->d_kind.biosdisk.partition >= lp->d_npartitions) { - DEBUG("partition '%c' exceeds partitions in table (a-'%c')", - 'a' + dev->d_kind.biosdisk.partition, 'a' + lp->d_npartitions); - return (EPART); - } - -#ifdef DISK_DEBUG - /* Complain if the partition is unused unless this is a floppy. */ - if ((lp->d_partitions[dev->d_kind.biosdisk.partition].p_fstype == FS_UNUSED) && - !(od->od_flags & BD_FLOPPY)) - DEBUG("warning, partition marked as unused"); -#endif - - od->od_boff = - lp->d_partitions[dev->d_kind.biosdisk.partition].p_offset - - lp->d_partitions[RAW_PART].p_offset + - sector; - } - return (0); -} - -/* - * Search for a slice with the following preferences: - * - * 1: Active FreeBSD slice - * 2: Non-active FreeBSD slice - * 3: Active Linux slice - * 4: non-active Linux slice - * 5: Active FAT/FAT32 slice - * 6: non-active FAT/FAT32 slice - */ -#define PREF_RAWDISK 0 -#define PREF_FBSD_ACT 1 -#define PREF_FBSD 2 -#define PREF_LINUX_ACT 3 -#define PREF_LINUX 4 -#define PREF_DOS_ACT 5 -#define PREF_DOS 6 -#define PREF_NONE 7 - -/* - * slicelimit is in the range 0 .. PC98_NPARTS - */ -static int -bd_bestslice(struct open_disk *od) -{ - struct pc98_partition *dp; - int pref, preflevel; - int i, prefslice; - - prefslice = 0; - preflevel = PREF_NONE; - - dp = &od->od_slicetab[0]; - for (i = 0; i < od->od_nslices; i++, dp++) { - switch(dp->dp_mid & PC98_MID_MASK) { - case PC98_MID_386BSD: /* FreeBSD */ - if ((dp->dp_mid & PC98_MID_BOOTABLE) && - (preflevel > PREF_FBSD_ACT)) { - pref = i; - preflevel = PREF_FBSD_ACT; - } else if (preflevel > PREF_FBSD) { - pref = i; - preflevel = PREF_FBSD; - } - break; - - case 0x11: /* DOS/Windows */ - case 0x20: - case 0x21: - case 0x22: - case 0x23: - case 0x63: - if ((dp->dp_mid & PC98_MID_BOOTABLE) && - (preflevel > PREF_DOS_ACT)) { - pref = i; - preflevel = PREF_DOS_ACT; - } else if (preflevel > PREF_DOS) { - pref = i; - preflevel = PREF_DOS; - } - break; - } - } - return (prefslice); -} - -static int -bd_close(struct open_file *f) -{ - struct i386_devdesc *dev = f->f_devdata; - struct open_disk *od = (struct open_disk *)(dev->d_kind.biosdisk.data); - - BD(dev).bd_open--; - if (BD(dev).bd_open == 0) { - bcache_free(BD(dev).bd_bcache); - BD(dev).bd_bcache = NULL; - } - - bd_closedisk(od); - return(0); -} - -static void -bd_closedisk(struct open_disk *od) -{ - DEBUG("open_disk %p", od); -#if 0 - /* XXX is this required? (especially if disk already open...) */ - if (od->od_flags & BD_FLOPPY) - delay(3000000); -#endif - free(od); -} - -static int -bd_strategy(void *devdata, int rw, daddr_t dblk, size_t size, - char *buf, size_t *rsize) -{ - struct bcache_devdata bcd; - struct i386_devdesc *dev = devdata; - struct open_disk *od = (struct open_disk *)(dev->d_kind.biosdisk.data); - - bcd.dv_strategy = bd_realstrategy; - bcd.dv_devdata = devdata; - bcd.dv_cache = BD(dev).bd_bcache; - return(bcache_strategy(&bcd, rw, dblk+od->od_boff, size, buf, rsize)); -} - -static int -bd_realstrategy(void *devdata, int rw, daddr_t dblk, - size_t size, char *buf, size_t *rsize) -{ - struct open_disk *od = (struct open_disk *)(((struct i386_devdesc *)devdata)->d_kind.biosdisk.data); - int blks; -#ifdef BD_SUPPORT_FRAGS - char fragbuf[BIOSDISK_SECSIZE]; - size_t fragsize; - - fragsize = size % BIOSDISK_SECSIZE; -#else - if (size % BIOSDISK_SECSIZE) - panic("bd_strategy: %d bytes I/O not multiple of block size", size); -#endif - - DEBUG("open_disk %p", od); - blks = size / BIOSDISK_SECSIZE; - if (rsize) - *rsize = 0; - - switch(rw){ - case F_READ: - DEBUG("read %d from %d to %p", blks, dblk, buf); - - if (blks && bd_read(od, dblk, blks, buf)) { - DEBUG("read error"); - return (EIO); - } -#ifdef BD_SUPPORT_FRAGS - DEBUG("bd_strategy: frag read %d from %d+%d to %p", - fragsize, dblk, blks, buf + (blks * BIOSDISK_SECSIZE)); - if (fragsize && bd_read(od, dblk + blks, 1, fragsize)) { - DEBUG("frag read error"); - return(EIO); - } - bcopy(fragbuf, buf + (blks * BIOSDISK_SECSIZE), fragsize); -#endif - break; - case F_WRITE : - DEBUG("write %d from %d to %p", blks, dblk, buf); - - if (blks && bd_write(od, dblk, blks, buf)) { - DEBUG("write error"); - return (EIO); - } -#ifdef BD_SUPPORT_FRAGS - if(fragsize) { - DEBUG("Attempted to write a frag"); - return (EIO); - } -#endif - break; - default: - /* DO NOTHING */ - return (EROFS); - } - - if (rsize) - *rsize = size; - return (0); -} - -/* Max number of sectors to bounce-buffer if the request crosses a 64k boundary */ -#define FLOPPY_BOUNCEBUF 18 - -static int -bd_chs_io(struct open_disk *od, daddr_t dblk, int blks, caddr_t dest, int write) -{ - u_int x, bpc, cyl, hd, sec; - - bpc = (od->od_sec * od->od_hds); /* blocks per cylinder */ - x = dblk; - cyl = x / bpc; /* block # / blocks per cylinder */ - x %= bpc; /* block offset into cylinder */ - hd = x / od->od_sec; /* offset / blocks per track */ - sec = x % od->od_sec; /* offset into track */ - - v86.ctl = V86_FLAGS; - v86.addr = 0x1b; - if (write) - v86.eax = 0x0500 | od->od_unit; - else - v86.eax = 0x0600 | od->od_unit; - if (od->od_flags & BD_FLOPPY) { - v86.eax |= 0xd000; - v86.ecx = 0x0200 | (cyl & 0xff); - v86.edx = (hd << 8) | (sec + 1); - } else if (od->od_flags & BD_OPTICAL) { - v86.eax &= 0xFF7F; - v86.ecx = dblk & 0xFFFF; - v86.edx = dblk >> 16; - } else { - v86.ecx = cyl; - v86.edx = (hd << 8) | sec; - } - v86.ebx = blks * BIOSDISK_SECSIZE; - v86.es = VTOPSEG(dest); - v86.ebp = VTOPOFF(dest); - v86int(); - return (V86_CY(v86.efl)); -} - -static int -bd_io(struct open_disk *od, daddr_t dblk, int blks, caddr_t dest, int write) -{ - u_int x, sec, result, resid, retry, maxfer; - caddr_t p, xp, bbuf, breg; - - /* Just in case some idiot actually tries to read/write -1 blocks... */ - if (blks < 0) - return (-1); - - resid = blks; - p = dest; - - /* Decide whether we have to bounce */ - if (VTOP(dest) >> 20 != 0 || - ((VTOP(dest) >> 16) != (VTOP(dest + blks * BIOSDISK_SECSIZE) >> 16))) { - - /* - * There is a 64k physical boundary somewhere in the - * destination buffer, or the destination buffer is above - * first 1MB of physical memory so we have to arrange a - * suitable bounce buffer. Allocate a buffer twice as large - * as we need to. Use the bottom half unless there is a break - * there, in which case we use the top half. - */ - x = min(od->od_sec, (unsigned)blks); - bbuf = alloca(x * 2 * BIOSDISK_SECSIZE); - if (((u_int32_t)VTOP(bbuf) & 0xffff0000) == - ((u_int32_t)VTOP(bbuf + x * BIOSDISK_SECSIZE) & 0xffff0000)) { - breg = bbuf; - } else { - breg = bbuf + x * BIOSDISK_SECSIZE; - } - maxfer = x; /* limit transfers to bounce region size */ - } else { - breg = bbuf = NULL; - maxfer = 0; - } - - while (resid > 0) { - /* - * Play it safe and don't cross track boundaries. - * (XXX this is probably unnecessary) - */ - sec = dblk % od->od_sec; /* offset into track */ - x = min(od->od_sec - sec, resid); - if (maxfer > 0) - x = min(x, maxfer); /* fit bounce buffer */ - - /* where do we transfer to? */ - xp = bbuf == NULL ? p : breg; - - /* - * Put your Data In, Put your Data out, - * Put your Data In, and shake it all about - */ - if (write && bbuf != NULL) - bcopy(p, breg, x * BIOSDISK_SECSIZE); - - /* - * Loop retrying the operation a couple of times. The BIOS - * may also retry. - */ - for (retry = 0; retry < 3; retry++) { - /* if retrying, reset the drive */ - if (retry > 0) { - v86.ctl = V86_FLAGS; - v86.addr = 0x1b; - v86.eax = 0x0300 | od->od_unit; - v86int(); - } - - result = bd_chs_io(od, dblk, x, xp, write); - if (result == 0) - break; - } - - if (write) - DEBUG("Write %d sector(s) from %p (0x%x) to %lld %s", x, - p, VTOP(p), dblk, result ? "failed" : "ok"); - else - DEBUG("Read %d sector(s) from %lld to %p (0x%x) %s", x, - dblk, p, VTOP(p), result ? "failed" : "ok"); - if (result) { - return(-1); - } - if (!write && bbuf != NULL) - bcopy(breg, p, x * BIOSDISK_SECSIZE); - p += (x * BIOSDISK_SECSIZE); - dblk += x; - resid -= x; - } - -/* hexdump(dest, (blks * BIOSDISK_SECSIZE)); */ - return(0); -} - -static int -bd_read(struct open_disk *od, daddr_t dblk, int blks, caddr_t dest) -{ - - return (bd_io(od, dblk, blks, dest, 0)); -} - -static int -bd_write(struct open_disk *od, daddr_t dblk, int blks, caddr_t dest) -{ - - return (bd_io(od, dblk, blks, dest, 1)); -} - -static int -bd_getgeom(struct open_disk *od) -{ - - if (od->od_flags & BD_FLOPPY) { - od->od_cyl = 79; - od->od_hds = 2; - od->od_sec = (od->od_unit & 0xf0) == 0x30 ? 18 : 15; - } else if (od->od_flags & BD_OPTICAL) { - od->od_cyl = 0xFFFE; - od->od_hds = 8; - od->od_sec = 32; - } else { - v86.ctl = V86_FLAGS; - v86.addr = 0x1b; - v86.eax = 0x8400 | od->od_unit; - v86int(); - - od->od_cyl = v86.ecx; - od->od_hds = (v86.edx >> 8) & 0xff; - od->od_sec = v86.edx & 0xff; - if (V86_CY(v86.efl)) - return(1); - } - - DEBUG("unit 0x%x geometry %d/%d/%d", od->od_unit, od->od_cyl, od->od_hds, od->od_sec); - return(0); -} - -/* - * Return the BIOS geometry of a given "fixed drive" in a format - * suitable for the legacy bootinfo structure. Since the kernel is - * expecting raw int 0x13/0x8 values for N_BIOS_GEOM drives, we - * prefer to get the information directly, rather than rely on being - * able to put it together from information already maintained for - * different purposes and for a probably different number of drives. - * - * For valid drives, the geometry is expected in the format (31..0) - * "000000cc cccccccc hhhhhhhh 00ssssss"; and invalid drives are - * indicated by returning the geometry of a "1.2M" PC-format floppy - * disk. And, incidentally, what is returned is not the geometry as - * such but the highest valid cylinder, head, and sector numbers. - */ -u_int32_t -bd_getbigeom(int bunit) -{ - int hds = 0; - int unit = 0x80; /* IDE HDD */ - u_int addr = 0xA155d; - - while (unit < 0xa7) { - if (*(u_char *)PTOV(addr) & (1 << (unit & 0x0f))) - if (hds++ == bunit) - break; - - if (unit >= 0xA0) { - int media = ((unsigned *)PTOV(0xA1460))[unit & 0x0F] & 0x1F; - - if (media == 7 && hds++ == bunit) /* SCSI MO */ - return(0xFFFE0820); /* C:65535 H:8 S:32 */ - } - if (++unit == 0x84) { - unit = 0xA0; /* SCSI HDD */ - addr = 0xA1482; - } - } - if (unit == 0xa7) - return 0x4F020F; /* 1200KB FD C:80 H:2 S:15 */ - v86.ctl = V86_FLAGS; - v86.addr = 0x1b; - v86.eax = 0x8400 | unit; - v86int(); - if (V86_CY(v86.efl)) - return 0x4F020F; /* 1200KB FD C:80 H:2 S:15 */ - return ((v86.ecx & 0xffff) << 16) | (v86.edx & 0xffff); -} - -/* - * Return a suitable dev_t value for (dev). - * - * In the case where it looks like (dev) is a SCSI disk, we allow the number of - * IDE disks to be specified in $num_ide_disks. There should be a Better Way. - */ -int -bd_getdev(struct i386_devdesc *dev) -{ - struct open_disk *od; - int biosdev; - int major; - int rootdev; - char *nip, *cp; - int unitofs = 0, i, unit; - - biosdev = bd_unit2bios(dev->d_unit); - DEBUG("unit %d BIOS device %d", dev->d_unit, biosdev); - if (biosdev == -1) /* not a BIOS device */ - return(-1); - if (bd_opendisk(&od, dev) != 0) /* oops, not a viable device */ - return(-1); - - if ((biosdev & 0xf0) == 0x90 || (biosdev & 0xf0) == 0x30) { - /* floppy (or emulated floppy) or ATAPI device */ - if (bdinfo[dev->d_unit].bd_type == DT_ATAPI) { - /* is an ATAPI disk */ - major = WFDMAJOR; - } else { - /* is a floppy disk */ - major = FDMAJOR; - } - } else { - /* harddisk */ - if ((od->od_flags & BD_LABELOK) && (od->od_disklabel.d_type == DTYPE_SCSI)) { - /* label OK, disk labelled as SCSI */ - major = DAMAJOR; - /* check for unit number correction hint, now deprecated */ - if ((nip = getenv("num_ide_disks")) != NULL) { - i = strtol(nip, &cp, 0); - /* check for parse error */ - if ((cp != nip) && (*cp == 0)) - unitofs = i; - } - } else { - /* assume an IDE disk */ - major = WDMAJOR; - } - } - /* default root disk unit number */ - if ((biosdev & 0xf0) == 0xa0) - unit = bdinfo[dev->d_unit].bd_da_unit; - else - unit = biosdev & 0xf; - - /* XXX a better kludge to set the root disk unit number */ - if ((nip = getenv("root_disk_unit")) != NULL) { - i = strtol(nip, &cp, 0); - /* check for parse error */ - if ((cp != nip) && (*cp == 0)) - unit = i; - } - - rootdev = MAKEBOOTDEV(major, dev->d_kind.biosdisk.slice + 1, unit, - dev->d_kind.biosdisk.partition); - DEBUG("dev is 0x%x\n", rootdev); - return(rootdev); -} diff --git a/sys/boot/pc98/libpc98/biosmem.c b/sys/boot/pc98/libpc98/biosmem.c deleted file mode 100644 index c5a9b302b02f..000000000000 --- a/sys/boot/pc98/libpc98/biosmem.c +++ /dev/null @@ -1,64 +0,0 @@ -/*- - * Copyright (c) 1998 Michael Smith <msmith@freebsd.org> - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -/* - * Obtain memory configuration information from the BIOS - */ -#include <stand.h> -#include "libi386.h" -#include "btxv86.h" - -vm_offset_t memtop, memtop_copyin, high_heap_base; -uint32_t bios_basemem, bios_extmem, high_heap_size; - -/* - * The minimum amount of memory to reserve in bios_extmem for the heap. - */ -#define HEAP_MIN (64 * 1024 * 1024) - -void -bios_getmem(void) -{ - - bios_basemem = ((*(u_char *)PTOV(0xA1501) & 0x07) + 1) * 128 * 1024; - bios_extmem = *(u_char *)PTOV(0xA1401) * 128 * 1024 + - *(u_int16_t *)PTOV(0xA1594) * 1024 * 1024; - - /* Set memtop to actual top of memory */ - memtop = memtop_copyin = 0x100000 + bios_extmem; - - /* - * If we have extended memory, use the last 3MB of 'extended' memory - * as a high heap candidate. - */ - if (bios_extmem >= HEAP_MIN) { - high_heap_size = HEAP_MIN; - high_heap_base = memtop - HEAP_MIN; - } -} diff --git a/sys/boot/pc98/libpc98/biossmap.c b/sys/boot/pc98/libpc98/biossmap.c deleted file mode 100644 index 5a7a89fd3efb..000000000000 --- a/sys/boot/pc98/libpc98/biossmap.c +++ /dev/null @@ -1,38 +0,0 @@ -/*- - * Copyright (c) 2006 TAKAHASHI Yoshihiro <nyan@FreeBSD.org> - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#include <stand.h> -#include <sys/param.h> -#include "libi386.h" - -void -bios_addsmapdata(struct preloaded_file *kfp) -{ - -} diff --git a/sys/boot/pc98/libpc98/comconsole.c b/sys/boot/pc98/libpc98/comconsole.c deleted file mode 100644 index 1bf2d6a2ccb7..000000000000 --- a/sys/boot/pc98/libpc98/comconsole.c +++ /dev/null @@ -1,367 +0,0 @@ -/*- - * Copyright (c) 1998 Michael Smith (msmith@freebsd.org) - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#include <stand.h> -#include <bootstrap.h> -#include <machine/cpufunc.h> -#include <dev/ic/ns16550.h> -#include <dev/pci/pcireg.h> -#include "libi386.h" - -#define COMC_FMT 0x3 /* 8N1 */ -#define COMC_TXWAIT 0x40000 /* transmit timeout */ -#define COMC_BPS(x) (115200 / (x)) /* speed to DLAB divisor */ -#define COMC_DIV2BPS(x) (115200 / (x)) /* DLAB divisor to speed */ - -#ifndef COMPORT -#define COMPORT 0x238 -#endif -#ifndef COMSPEED -#define COMSPEED 9600 -#endif - -static void comc_probe(struct console *cp); -static int comc_init(int arg); -static void comc_putchar(int c); -static int comc_getchar(void); -static int comc_getspeed(void); -static int comc_ischar(void); -static int comc_parseint(const char *string); -static uint32_t comc_parse_pcidev(const char *string); -static int comc_pcidev_set(struct env_var *ev, int flags, - const void *value); -static int comc_pcidev_handle(uint32_t locator); -static int comc_port_set(struct env_var *ev, int flags, - const void *value); -static void comc_setup(int speed, int port); -static int comc_speed_set(struct env_var *ev, int flags, - const void *value); - -static int comc_curspeed; -static int comc_port = COMPORT; -static uint32_t comc_locator; - -struct console comconsole = { - "comconsole", - "serial port", - 0, - comc_probe, - comc_init, - comc_putchar, - comc_getchar, - comc_ischar -}; - -static void -comc_probe(struct console *cp) -{ - char intbuf[16]; - char *cons, *env; - int speed, port; - uint32_t locator; - - if (comc_curspeed == 0) { - comc_curspeed = COMSPEED; - /* - * Assume that the speed was set by an earlier boot loader if - * comconsole is already the preferred console. - */ - cons = getenv("console"); - if ((cons != NULL && strcmp(cons, comconsole.c_name) == 0) || - getenv("boot_multicons") != NULL) { - comc_curspeed = comc_getspeed(); - } - - env = getenv("comconsole_speed"); - if (env != NULL) { - speed = comc_parseint(env); - if (speed > 0) - comc_curspeed = speed; - } - - sprintf(intbuf, "%d", comc_curspeed); - unsetenv("comconsole_speed"); - env_setenv("comconsole_speed", EV_VOLATILE, intbuf, comc_speed_set, - env_nounset); - - env = getenv("comconsole_port"); - if (env != NULL) { - port = comc_parseint(env); - if (port > 0) - comc_port = port; - } - - sprintf(intbuf, "%d", comc_port); - unsetenv("comconsole_port"); - env_setenv("comconsole_port", EV_VOLATILE, intbuf, comc_port_set, - env_nounset); - - env = getenv("comconsole_pcidev"); - if (env != NULL) { - locator = comc_parse_pcidev(env); - if (locator != 0) - comc_pcidev_handle(locator); - } - - unsetenv("comconsole_pcidev"); - env_setenv("comconsole_pcidev", EV_VOLATILE, env, comc_pcidev_set, - env_nounset); - } - comc_setup(comc_curspeed, comc_port); -} - -static int -comc_init(int arg) -{ - - comc_setup(comc_curspeed, comc_port); - - if ((comconsole.c_flags & (C_PRESENTIN | C_PRESENTOUT)) == - (C_PRESENTIN | C_PRESENTOUT)) - return (CMD_OK); - return (CMD_ERROR); -} - -static void -comc_putchar(int c) -{ - int wait; - - for (wait = COMC_TXWAIT; wait > 0; wait--) - if (inb(comc_port + com_lsr) & LSR_TXRDY) { - outb(comc_port + com_data, (u_char)c); - break; - } -} - -static int -comc_getchar(void) -{ - return (comc_ischar() ? inb(comc_port + com_data) : -1); -} - -static int -comc_ischar(void) -{ - return (inb(comc_port + com_lsr) & LSR_RXRDY); -} - -static int -comc_speed_set(struct env_var *ev, int flags, const void *value) -{ - int speed; - - if (value == NULL || (speed = comc_parseint(value)) <= 0) { - printf("Invalid speed\n"); - return (CMD_ERROR); - } - - if (comc_curspeed != speed) - comc_setup(speed, comc_port); - - env_setenv(ev->ev_name, flags | EV_NOHOOK, value, NULL, NULL); - - return (CMD_OK); -} - -static int -comc_port_set(struct env_var *ev, int flags, const void *value) -{ - int port; - - if (value == NULL || (port = comc_parseint(value)) <= 0) { - printf("Invalid port\n"); - return (CMD_ERROR); - } - - if (comc_port != port) - comc_setup(comc_curspeed, port); - - env_setenv(ev->ev_name, flags | EV_NOHOOK, value, NULL, NULL); - - return (CMD_OK); -} - -/* - * Input: bus:dev:func[:bar]. If bar is not specified, it is 0x10. - * Output: bar[24:16] bus[15:8] dev[7:3] func[2:0] - */ -static uint32_t -comc_parse_pcidev(const char *string) -{ - char *p, *p1; - uint8_t bus, dev, func, bar; - uint32_t locator; - int pres; - - pres = strtol(string, &p, 0); - if (p == string || *p != ':' || pres < 0 ) - return (0); - bus = pres; - p1 = ++p; - - pres = strtol(p1, &p, 0); - if (p == string || *p != ':' || pres < 0 ) - return (0); - dev = pres; - p1 = ++p; - - pres = strtol(p1, &p, 0); - if (p == string || (*p != ':' && *p != '\0') || pres < 0 ) - return (0); - func = pres; - - if (*p == ':') { - p1 = ++p; - pres = strtol(p1, &p, 0); - if (p == string || *p != '\0' || pres <= 0 ) - return (0); - bar = pres; - } else - bar = 0x10; - - locator = (bar << 16) | biospci_locator(bus, dev, func); - return (locator); -} - -static int -comc_pcidev_handle(uint32_t locator) -{ - char intbuf[64]; - uint32_t port; - - if (biospci_read_config(locator & 0xffff, - (locator & 0xff0000) >> 16, 2, &port) == -1) { - printf("Cannot read bar at 0x%x\n", locator); - return (CMD_ERROR); - } - if (!PCI_BAR_IO(port)) { - printf("Memory bar at 0x%x\n", locator); - return (CMD_ERROR); - } - port &= PCIM_BAR_IO_BASE; - - sprintf(intbuf, "%d", port); - unsetenv("comconsole_port"); - env_setenv("comconsole_port", EV_VOLATILE, intbuf, - comc_port_set, env_nounset); - - comc_setup(comc_curspeed, port); - comc_locator = locator; - - return (CMD_OK); -} - -static int -comc_pcidev_set(struct env_var *ev, int flags, const void *value) -{ - uint32_t locator; - int error; - - if (value == NULL || (locator = comc_parse_pcidev(value)) <= 0) { - printf("Invalid pcidev\n"); - return (CMD_ERROR); - } - if ((comconsole.c_flags & (C_ACTIVEIN | C_ACTIVEOUT)) != 0 && - comc_locator != locator) { - error = comc_pcidev_handle(locator); - if (error != CMD_OK) - return (error); - } - env_setenv(ev->ev_name, flags | EV_NOHOOK, value, NULL, NULL); - return (CMD_OK); -} - -static void -comc_setup(int speed, int port) -{ - static int TRY_COUNT = 1000000; - char intbuf[64]; - int tries; - - unsetenv("hw.uart.console"); - comc_curspeed = speed; - comc_port = port; - if ((comconsole.c_flags & (C_ACTIVEIN | C_ACTIVEOUT)) == 0) - return; - - outb(comc_port + com_cfcr, CFCR_DLAB | COMC_FMT); - outb(comc_port + com_dlbl, COMC_BPS(speed) & 0xff); - outb(comc_port + com_dlbh, COMC_BPS(speed) >> 8); - outb(comc_port + com_cfcr, COMC_FMT); - outb(comc_port + com_mcr, MCR_RTS | MCR_DTR); - - tries = 0; - do - inb(comc_port + com_data); - while (inb(comc_port + com_lsr) & LSR_RXRDY && ++tries < TRY_COUNT); - - if (tries < TRY_COUNT) { - comconsole.c_flags |= (C_PRESENTIN | C_PRESENTOUT); - sprintf(intbuf, "io:%d,br:%d", comc_port, comc_curspeed); - env_setenv("hw.uart.console", EV_VOLATILE, intbuf, NULL, NULL); - } else - comconsole.c_flags &= ~(C_PRESENTIN | C_PRESENTOUT); -} - -static int -comc_parseint(const char *speedstr) -{ - char *p; - int speed; - - speed = strtol(speedstr, &p, 0); - if (p == speedstr || *p != '\0' || speed <= 0) - return (-1); - - return (speed); -} - -static int -comc_getspeed(void) -{ - u_int divisor; - u_char dlbh; - u_char dlbl; - u_char cfcr; - - cfcr = inb(comc_port + com_cfcr); - outb(comc_port + com_cfcr, CFCR_DLAB | cfcr); - - dlbl = inb(comc_port + com_dlbl); - dlbh = inb(comc_port + com_dlbh); - - outb(comc_port + com_cfcr, cfcr); - - divisor = dlbh << 8 | dlbl; - - /* XXX there should be more sanity checking. */ - if (divisor == 0) - return (COMSPEED); - return (COMC_DIV2BPS(divisor)); -} diff --git a/sys/boot/pc98/libpc98/libpc98.h b/sys/boot/pc98/libpc98/libpc98.h deleted file mode 100644 index 78b07a10ffa3..000000000000 --- a/sys/boot/pc98/libpc98/libpc98.h +++ /dev/null @@ -1,29 +0,0 @@ -/*- - * Copyright (c) 2009 TAKAHASHI Yoshihiro <nyan@FreeBSD.org> - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * $FreeBSD$ - */ - -void set_machine_type(void); diff --git a/sys/boot/pc98/libpc98/pc98_sys.c b/sys/boot/pc98/libpc98/pc98_sys.c deleted file mode 100644 index 7f66d02c630f..000000000000 --- a/sys/boot/pc98/libpc98/pc98_sys.c +++ /dev/null @@ -1,78 +0,0 @@ -/*- - * Copyright (c) 2009 TAKAHASHI Yoshihiro <nyan@FreeBSD.org> - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#include <btxv86.h> -#include <machine/cpufunc.h> -#define _KERNEL -#include <pc98/pc98/pc98_machdep.h> - -/* - * Set machine type to PC98_SYSTEM_PARAMETER. - */ -void -set_machine_type(void) -{ - int i; - u_long ret, data; - - /* PC98_SYSTEM_PARAMETER (0x501) */ - ret = ((*(u_char *)PTOV(0xA1501)) & 0x08) >> 3; - - /* Wait V-SYNC */ - while (inb(0x60) & 0x20) {} - while (!(inb(0x60) & 0x20)) {} - - /* ANK 'A' font */ - outb(0xa1, 0x00); - outb(0xa3, 0x41); - - /* M_NORMAL, use CG window (all NEC OK) */ - for (i = data = 0; i < 4; i++) - data += *((u_long *)PTOV(0xA4000) + i); /* 0xa4000 */ - if (data == 0x6efc58fc) /* DA data */ - ret |= M_NEC_PC98; - else - ret |= M_EPSON_PC98; - ret |= (inb(0x42) & 0x20) ? M_8M : 0; - - /* PC98_SYSTEM_PARAMETER(0x400) */ - if ((*(u_char *)PTOV(0xA1400)) & 0x80) - ret |= M_NOTE; - if (ret & M_NEC_PC98) { - /* PC98_SYSTEM_PARAMETER(0x458) */ - if ((*(u_char *)PTOV(0xA1458)) & 0x80) - ret |= M_H98; - else - ret |= M_NOT_H98; - } else - ret |= M_NOT_H98; - - (*(u_long *)PTOV(0xA1620)) = ret; -} diff --git a/sys/boot/pc98/libpc98/time.c b/sys/boot/pc98/libpc98/time.c deleted file mode 100644 index 5d832bb45b7e..000000000000 --- a/sys/boot/pc98/libpc98/time.c +++ /dev/null @@ -1,98 +0,0 @@ -/*- - * Copyright (c) 1998 Michael Smith <msmith@freebsd.org> - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#include <stand.h> -#include <btxv86.h> -#include <machine/cpufunc.h> -#include "bootstrap.h" -#include "libi386.h" - -static int bios_seconds(void); - -/* - * Return the BIOS time-of-day value. - * - * XXX uses undocumented BCD support from libstand. - */ -static int -bios_seconds(void) -{ - int hr, minute, sec; - unsigned char bios_time[6]; - - v86.ctl = 0; - v86.addr = 0x1c; /* int 0x1c, function 0 */ - v86.eax = 0x0000; - v86.es = VTOPSEG(bios_time); - v86.ebx = VTOPOFF(bios_time); - v86int(); - - hr = bcd2bin(bios_time[3]); - minute = bcd2bin(bios_time[4]); - sec = bcd2bin(bios_time[5]); - - return (hr * 3600 + minute * 60 + sec); -} - -/* - * Return the time in seconds since the beginning of the day. - */ -time_t -time(time_t *t) -{ - static time_t lasttime; - time_t now; - - now = bios_seconds(); - - if (now < lasttime) - now += 24 * 3600; - lasttime = now; - - if (t != NULL) - *t = now; - return(now); -} - -/* - * Use the BIOS Wait function to pause for (period) microseconds. - * - * Resolution of this function is variable, but typically around - * 1ms. - */ -void -delay(int period) -{ - int i; - - period = (period + 500) / 1000; - for( ; period != 0 ; period--) - for(i=800;i != 0; i--) - outb(0x5f,0); /* wait 600ns */ -} diff --git a/sys/boot/pc98/libpc98/vidconsole.c b/sys/boot/pc98/libpc98/vidconsole.c deleted file mode 100644 index 7cf81e81a371..000000000000 --- a/sys/boot/pc98/libpc98/vidconsole.c +++ /dev/null @@ -1,596 +0,0 @@ -/*- - * Copyright (c) 1998 Michael Smith (msmith@freebsd.org) - * Copyright (c) 1997 Kazutaka YOKOTA (yokota@zodiac.mech.utsunomiya-u.ac.jp) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * Id: probe_keyboard.c,v 1.13 1997/06/09 05:10:55 bde Exp - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#include <stand.h> -#include <bootstrap.h> -#include <btxv86.h> -#include <machine/cpufunc.h> -#include "libi386.h" - -#if KEYBOARD_PROBE -#include <machine/cpufunc.h> - -static int probe_keyboard(void); -#endif -static void vidc_probe(struct console *cp); -static int vidc_init(int arg); -static void vidc_putchar(int c); -static int vidc_getchar(void); -static int vidc_ischar(void); - -static int vidc_started; - -#ifdef TERM_EMU -#define MAXARGS 8 -#define DEFAULT_FGCOLOR 7 -#define DEFAULT_BGCOLOR 0 - -void end_term(void); -void bail_out(int c); -void vidc_term_emu(int c); -void get_pos(void); -void curs_move(int x, int y); -void write_char(int c, int fg, int bg); -void scroll_up(int rows, int fg, int bg); -void CD(void); -void CM(void); -void HO(void); - -static int args[MAXARGS], argc; -static int fg_c, bg_c, curx, cury; -static int esc; -#endif - -static unsigned short *crtat, *Crtat; -static int row = 25, col = 80; -#ifdef TERM_EMU -static u_int8_t ibmpc_to_pc98[256] = { - 0x01, 0x21, 0x81, 0xa1, 0x41, 0x61, 0xc1, 0xe1, - 0x09, 0x29, 0x89, 0xa9, 0x49, 0x69, 0xc9, 0xe9, - 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, - 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, - 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, - 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, - 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, - 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, - 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, - 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, - 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, - 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, - 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, - 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, - 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, - 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, - - 0x03, 0x23, 0x83, 0xa3, 0x43, 0x63, 0xc3, 0xe3, - 0x0b, 0x2b, 0x8b, 0xab, 0x4b, 0x6b, 0xcb, 0xeb, - 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, - 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, - 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, - 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, - 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, - 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, - 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, - 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, - 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, - 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, - 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, - 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, - 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, - 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, -}; -#define at2pc98(fg_at, bg_at) ibmpc_to_pc98[((bg_at) << 4) | (fg_at)] -#endif /* TERM_EMU */ - -struct console vidconsole = { - "vidconsole", - "internal video/keyboard", - 0, - vidc_probe, - vidc_init, - vidc_putchar, - vidc_getchar, - vidc_ischar -}; - -static void -vidc_probe(struct console *cp) -{ - - /* look for a keyboard */ -#if KEYBOARD_PROBE - if (probe_keyboard()) -#endif - { - - cp->c_flags |= C_PRESENTIN; - } - - /* XXX for now, always assume we can do BIOS screen output */ - cp->c_flags |= C_PRESENTOUT; -} - -static int -vidc_init(int arg) -{ - int i, hw_cursor; - - if (vidc_started && arg == 0) - return (0); - vidc_started = 1; - Crtat = (unsigned short *)PTOV(0xA0000); - while ((inb(0x60) & 0x04) == 0) - ; - outb(0x62, 0xe0); - while ((inb(0x60) & 0x01) == 0) - ; - hw_cursor = inb(0x62); - hw_cursor |= (inb(0x62) << 8); - inb(0x62); - inb(0x62); - inb(0x62); - crtat = Crtat + hw_cursor; -#ifdef TERM_EMU - /* Init terminal emulator */ - end_term(); - get_pos(); - curs_move(curx, cury); - fg_c = DEFAULT_FGCOLOR; - bg_c = DEFAULT_BGCOLOR; -#endif - for (i = 0; i < 10 && vidc_ischar(); i++) - (void)vidc_getchar(); - return (0); /* XXX reinit? */ -} - -static void -beep(void) -{ - - outb(0x37, 6); - delay(40000); - outb(0x37, 7); -} - -#if 0 -static void -vidc_biosputchar(int c) -{ - unsigned short *cp; - int i, pos; - -#ifdef TERM_EMU - *crtat = (c == 0x5c ? 0xfc : c); - *(crtat + 0x1000) = at2pc98(fg, bg); -#else - switch(c) { - case '\b': - crtat--; - break; - case '\r': - crtat -= (crtat - Crtat) % col; - break; - case '\n': - crtat += col; - break; - default: - *crtat = (c == 0x5c ? 0xfc : c); - *(crtat++ + 0x1000) = 0xe1; - break; - } - - if (crtat >= Crtat + col * row) { - cp = Crtat; - for (i = 1; i < row; i++) { - bcopy((void *)(cp + col), (void *)cp, col * 2); - cp += col; - } - for (i = 0; i < col; i++) { - *cp++ = ' '; - } - crtat -= col; - } - pos = crtat - Crtat; - while ((inb(0x60) & 0x04) == 0) {} - outb(0x62, 0x49); - outb(0x60, pos & 0xff); - outb(0x60, pos >> 8); -#endif -} -#endif - -static void -vidc_rawputchar(int c) -{ - int i; - - if (c == '\t') - /* lame tab expansion */ - for (i = 0; i < 8; i++) - vidc_rawputchar(' '); - else { - /* Emulate AH=0eh (teletype output) */ - switch(c) { - case '\a': - beep(); - return; - case '\r': - curx = 0; - curs_move(curx, cury); - return; - case '\n': - cury++; - if (cury > 24) { - scroll_up(1, fg_c, bg_c); - cury--; - } else { - curs_move(curx, cury); - } - return; - case '\b': - if (curx > 0) { - curx--; - curs_move(curx, cury); - /* write_char(' ', fg_c, bg_c); XXX destructive(!) */ - return; - } - return; - default: - write_char(c, fg_c, bg_c); - curx++; - if (curx > 79) { - curx = 0; - cury++; - } - if (cury > 24) { - curx = 0; - scroll_up(1, fg_c, bg_c); - cury--; - } - } - curs_move(curx, cury); - } -} - -#ifdef TERM_EMU - -/* Get cursor position on the screen. Result is in edx. Sets - * curx and cury appropriately. - */ -void -get_pos(void) -{ - int pos = crtat - Crtat; - - curx = pos % col; - cury = pos / col; -} - -/* Move cursor to x rows and y cols (0-based). */ -void -curs_move(int x, int y) -{ - int pos; - - pos = x + y * col; - crtat = Crtat + pos; - pos = crtat - Crtat; - while((inb(0x60) & 0x04) == 0) {} - outb(0x62, 0x49); - outb(0x60, pos & 0xff); - outb(0x60, pos >> 8); - curx = x; - cury = y; -#define isvisible(c) (((c) >= 32) && ((c) < 255)) - if (!isvisible(*crtat & 0x00ff)) { - write_char(' ', fg_c, bg_c); - } -} - -/* Scroll up the whole window by a number of rows. If rows==0, - * clear the window. fg and bg are attributes for the new lines - * inserted in the window. - */ -void -scroll_up(int rows, int fgcol, int bgcol) -{ - unsigned short *cp; - int i; - - if (rows == 0) - rows = 25; - cp = Crtat; - for (i = rows; i < row; i++) { - bcopy((void *)(cp + col), (void *)cp, col * 2); - cp += col; - } - for (i = 0; i < col; i++) { - *(cp + 0x1000) = at2pc98(fgcol, bgcol); - *cp++ = ' '; - } -} - -/* Write character and attribute at cursor position. */ -void -write_char(int c, int fgcol, int bgcol) -{ - - *crtat = (c == 0x5c ? 0xfc : (c & 0xff)); - *(crtat + 0x1000) = at2pc98(fgcol, bgcol); -} - -/**************************************************************/ -/* - * Screen manipulation functions. They use accumulated data in - * args[] and argc variables. - * - */ - -/* Clear display from current position to end of screen */ -void -CD(void) -{ - int pos; - - get_pos(); - for (pos = 0; crtat + pos <= Crtat + col * row; pos++) { - *(crtat + pos) = ' '; - *(crtat + pos + 0x1000) = at2pc98(fg_c, bg_c); - } - end_term(); -} - -/* Absolute cursor move to args[0] rows and args[1] columns - * (the coordinates are 1-based). - */ -void -CM(void) -{ - - if (args[0] > 0) - args[0]--; - if (args[1] > 0) - args[1]--; - curs_move(args[1], args[0]); - end_term(); -} - -/* Home cursor (left top corner) */ -void -HO(void) -{ - - argc = 1; - args[0] = args[1] = 1; - CM(); -} - -/* Clear internal state of the terminal emulation code */ -void -end_term(void) -{ - - esc = 0; - argc = -1; -} - -/* Gracefully exit ESC-sequence processing in case of misunderstanding */ -void -bail_out(int c) -{ - char buf[16], *ch; - int i; - - if (esc) { - vidc_rawputchar('\033'); - if (esc != '\033') - vidc_rawputchar(esc); - for (i = 0; i <= argc; ++i) { - sprintf(buf, "%d", args[i]); - ch = buf; - while (*ch) - vidc_rawputchar(*ch++); - } - } - vidc_rawputchar(c); - end_term(); -} - -static void -get_arg(int c) -{ - - if (argc < 0) - argc = 0; - args[argc] *= 10; - args[argc] += c - '0'; -} - -/* Emulate basic capabilities of cons25 terminal */ -void -vidc_term_emu(int c) -{ - static int ansi_col[] = { - 0, 4, 2, 6, 1, 5, 3, 7, - }; - int t; - int i; - - switch (esc) { - case 0: - switch (c) { - case '\033': - esc = c; - break; - default: - vidc_rawputchar(c); - break; - } - break; - - case '\033': - switch (c) { - case '[': - esc = c; - args[0] = 0; - argc = -1; - break; - default: - bail_out(c); - break; - } - break; - - case '[': - switch (c) { - case ';': - if (argc < 0) /* XXX */ - argc = 0; - else if (argc + 1 >= MAXARGS) - bail_out(c); - else - args[++argc] = 0; - break; - case 'H': - if (argc < 0) - HO(); - else if (argc == 1) - CM(); - else - bail_out(c); - break; - case 'J': - if (argc < 0) - CD(); - else - bail_out(c); - break; - case 'm': - if (argc < 0) { - fg_c = DEFAULT_FGCOLOR; - bg_c = DEFAULT_BGCOLOR; - } - for (i = 0; i <= argc; ++i) { - switch (args[i]) { - case 0: /* back to normal */ - fg_c = DEFAULT_FGCOLOR; - bg_c = DEFAULT_BGCOLOR; - break; - case 1: /* bold */ - fg_c |= 0x8; - break; - case 4: /* underline */ - case 5: /* blink */ - bg_c |= 0x8; - break; - case 7: /* reverse */ - t = fg_c; - fg_c = bg_c; - bg_c = t; - break; - case 30: case 31: case 32: case 33: - case 34: case 35: case 36: case 37: - fg_c = ansi_col[args[i] - 30]; - break; - case 39: /* normal */ - fg_c = DEFAULT_FGCOLOR; - break; - case 40: case 41: case 42: case 43: - case 44: case 45: case 46: case 47: - bg_c = ansi_col[args[i] - 40]; - break; - case 49: /* normal */ - bg_c = DEFAULT_BGCOLOR; - break; - } - } - end_term(); - break; - default: - if (isdigit(c)) - get_arg(c); - else - bail_out(c); - break; - } - break; - - default: - bail_out(c); - break; - } -} -#endif - -static void -vidc_putchar(int c) -{ -#ifdef TERM_EMU - vidc_term_emu(c); -#else - vidc_rawputchar(c); -#endif -} - -static int -vidc_getchar(void) -{ - - if (vidc_ischar()) { - v86.ctl = 0; - v86.addr = 0x18; - v86.eax = 0x0; - v86int(); - return (v86.eax & 0xff); - } else { - return (-1); - } -} - -static int -vidc_ischar(void) -{ - - v86.ctl = 0; - v86.addr = 0x18; - v86.eax = 0x100; - v86int(); - return ((v86.ebx >> 8) & 0x1); -} - -#if KEYBOARD_PROBE -static int -probe_keyboard(void) -{ - return (*(u_char *)PTOV(0xA1481) & 0x48); -} -#endif /* KEYBOARD_PROBE */ diff --git a/sys/boot/pc98/loader/Makefile b/sys/boot/pc98/loader/Makefile deleted file mode 100644 index d75e8d04e284..000000000000 --- a/sys/boot/pc98/loader/Makefile +++ /dev/null @@ -1,99 +0,0 @@ -# $FreeBSD$ - -.include <src.opts.mk> -MK_SSP= no -MAN= - -LOADER?= loader -PROG= ${LOADER}.sym -INTERNALPROG= -NEWVERSWHAT= "bootstrap loader" pc98 -VERSION_FILE= ${.CURDIR}/../../i386/loader/version - -# architecture-specific loader code -SRCS= main.c conf.c vers.c -.PATH: ${.CURDIR}/../../i386/loader - -# Enable PXE TFTP or NFS support, not both. -.if defined(LOADER_TFTP_SUPPORT) -CFLAGS+= -DLOADER_TFTP_SUPPORT -.else -CFLAGS+= -DLOADER_NFS_SUPPORT -.endif - -# Include bcache code. -HAVE_BCACHE= yes - -# Enable PnP and ISA-PnP code. -HAVE_PNP= yes -HAVE_ISABUS= yes - -.if ${MK_FORTH} != "no" -# Enable BootForth -BOOT_FORTH= yes -CFLAGS+= -DBOOT_FORTH -I${.CURDIR}/../../ficl -I${.CURDIR}/../../ficl/i386 -LIBFICL= ${.OBJDIR}/../../ficl/libficl.a -.endif - -.if defined(LOADER_BZIP2_SUPPORT) -CFLAGS+= -DLOADER_BZIP2_SUPPORT -.endif -.if !defined(LOADER_NO_GZIP_SUPPORT) -CFLAGS+= -DLOADER_GZIP_SUPPORT -.endif - -# Always add MI sources -.PATH: ${.CURDIR}/../../common -.include "${.CURDIR}/../../common/Makefile.inc" -CFLAGS+= -I${.CURDIR}/../../common -CFLAGS+= -I${.CURDIR}/../../i386 -CFLAGS+= -I. - -CLEANFILES= ${LOADER} ${LOADER}.bin loader.help - -CFLAGS+= -Wall -LDFLAGS= -static -Ttext 0x0 - -# pc98 standalone support library -LIBPC98= ${.OBJDIR}/../libpc98/libpc98.a -CFLAGS+= -I${.CURDIR}/.. - -LIBSTAND= ${.OBJDIR}/../../libstand32/libstand.a - -# BTX components -CFLAGS+= -I${.CURDIR}/../btx/lib - -# Debug me! -#CFLAGS+= -g -#LDFLAGS+= -g - -# Pick up ../Makefile.inc early. -.include <bsd.init.mk> - -${LOADER}: ${LOADER}.bin ${BTXLDR} ${BTXKERN} - btxld -v -f aout -e ${LOADER_ADDRESS} -o ${.TARGET} -l ${BTXLDR} \ - -b ${BTXKERN} ${LOADER}.bin - -${LOADER}.bin: ${LOADER}.sym - cp ${.ALLSRC} ${.TARGET} - strip -R .comment -R .note ${.TARGET} - -loader.help: help.common help.pc98 - cat ${.ALLSRC} | awk -f ${.CURDIR}/../../common/merge_help.awk > ${.TARGET} - -FILES= ${LOADER} -# XXX INSTALLFLAGS_loader= -b -FILESMODE_${LOADER}= ${BINMODE} -b - -.PATH: ${.CURDIR}/../../forth -.include "${.CURDIR}/../../forth/Makefile.inc" - -FILES+= ${.CURDIR}/../../i386/loader/loader.rc menu.rc - -# XXX crt0.o needs to be first for pxeboot(8) to work -OBJS= ${BTXCRT} - -DPADD= ${LIBFICL} ${LIBPC98} ${LIBSTAND} -LDADD= ${LIBFICL} ${LIBPC98} ${LIBSTAND} - -.include <bsd.prog.mk> diff --git a/sys/boot/pc98/loader/conf.c b/sys/boot/pc98/loader/conf.c deleted file mode 100644 index 695c2604c03a..000000000000 --- a/sys/boot/pc98/loader/conf.c +++ /dev/null @@ -1,116 +0,0 @@ -/*- - * Copyright (c) 1998 Michael Smith <msmith@freebsd.org> - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#include <stand.h> -#include <bootstrap.h> -#include "libi386/libi386.h" - -/* - * We could use linker sets for some or all of these, but - * then we would have to control what ended up linked into - * the bootstrap. So it's easier to conditionalise things - * here. - * - * XXX rename these arrays to be consistent and less namespace-hostile - * - * XXX as libi386 and biosboot merge, some of these can become linker sets. - */ - -/* Exported for libstand */ -struct devsw *devsw[] = { - &bioscd, - &biosdisk, -#if defined(LOADER_NFS_SUPPORT) || defined(LOADER_TFTP_SUPPORT) - &pxedisk, -#endif - NULL -}; - -struct fs_ops *file_system[] = { - &ufs_fsops, - &ext2fs_fsops, - &dosfs_fsops, - &cd9660_fsops, -#ifdef LOADER_NFS_SUPPORT - &nfs_fsops, -#endif -#ifdef LOADER_TFTP_SUPPORT - &tftp_fsops, -#endif -#ifdef LOADER_GZIP_SUPPORT - &gzipfs_fsops, -#endif -#ifdef LOADER_BZIP2_SUPPORT - &bzipfs_fsops, -#endif - &splitfs_fsops, - NULL -}; - -/* Exported for i386 only */ -/* - * Sort formats so that those that can detect based on arguments - * rather than reading the file go first. - */ -extern struct file_format i386_elf; -extern struct file_format i386_elf_obj; - -struct file_format *file_formats[] = { - &i386_elf, - &i386_elf_obj, - NULL -}; - -/* - * Consoles - * - * We don't prototype these in libi386.h because they require - * data structures from bootstrap.h as well. - */ -extern struct console vidconsole; -extern struct console comconsole; -extern struct console nullconsole; - -struct console *consoles[] = { - &vidconsole, - &comconsole, - &nullconsole, - NULL -}; - -extern struct pnphandler isapnphandler; -extern struct pnphandler biospnphandler; -extern struct pnphandler biospcihandler; - -struct pnphandler *pnphandlers[] = { - &biospnphandler, /* should go first, as it may set isapnp_readport */ - &isapnphandler, - &biospcihandler, - NULL -}; diff --git a/sys/boot/pc98/loader/help.pc98 b/sys/boot/pc98/loader/help.pc98 deleted file mode 100644 index 4b9197ce5074..000000000000 --- a/sys/boot/pc98/loader/help.pc98 +++ /dev/null @@ -1,38 +0,0 @@ -################################################################################ -# Treboot DReboot the system - - reboot - - Causes the system to immediately reboot. - -################################################################################ -# Theap DDisplay memory management statistics - - heap - - Requests debugging output from the heap manager. For debugging use - only. - -################################################################################ -# Tset Snum_ide_disks DSet the number of IDE disks - - NOTE: this variable is deprecated, use root_disk_unit instead. - - set num_ide_disks=<value> - - When booting from a SCSI disk on a system with one or more IDE disks, - and where the IDE disks are the default boot device, it is necessary - to tell the kernel how many IDE disks there are in order to have it - correctly locate the SCSI disk you are booting from. - -################################################################################ -# Tset Sroot_disk_unit DForce the root disk unit number. - - set root_disk_unit=<value> - - If the code which detects the disk unit number for the root disk is - confused, eg. by a mix of SCSI and IDE disks, or IDE disks with - gaps in the sequence (eg. no primary slave), the unit number can be - forced by setting this variable. - -################################################################################ diff --git a/sys/boot/pc98/loader/main.c b/sys/boot/pc98/loader/main.c deleted file mode 100644 index c31cc842a035..000000000000 --- a/sys/boot/pc98/loader/main.c +++ /dev/null @@ -1,322 +0,0 @@ -/*- - * Copyright (c) 1998 Michael Smith <msmith@freebsd.org> - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -/* - * MD bootstrap main() and assorted miscellaneous - * commands. - */ - -#include <stand.h> -#include <stddef.h> -#include <string.h> -#include <machine/bootinfo.h> -#include <machine/cpufunc.h> -#include <sys/param.h> -#include <sys/reboot.h> - -#include "bootstrap.h" -#include "common/bootargs.h" -#include "libi386/libi386.h" -#include "libpc98/libpc98.h" -#include "btxv86.h" - -CTASSERT(sizeof(struct bootargs) == BOOTARGS_SIZE); -CTASSERT(offsetof(struct bootargs, bootinfo) == BA_BOOTINFO); -CTASSERT(offsetof(struct bootargs, bootflags) == BA_BOOTFLAGS); -CTASSERT(offsetof(struct bootinfo, bi_size) == BI_SIZE); - -/* Arguments passed in from the boot1/boot2 loader */ -static struct bootargs *kargs; - -static u_int32_t initial_howto; -static u_int32_t initial_bootdev; -static struct bootinfo *initial_bootinfo; - -struct arch_switch archsw; /* MI/MD interface boundary */ - -static void extract_currdev(void); -static int isa_inb(int port); -static void isa_outb(int port, int value); -void exit(int code); - -/* from vers.c */ -extern char bootprog_info[]; - -/* XXX debugging */ -extern char end[]; - -static void *heap_top; -static void *heap_bottom; - -static uint64_t -pc98_loadaddr(u_int type, void *data, uint64_t addr) -{ - struct stat st; - - if (type == LOAD_ELF) - return (roundup(addr, PAGE_SIZE)); - - /* We cannot use 15M-16M area on pc98. */ - if (type == LOAD_RAW && addr < 0x1000000 && stat(data, &st) == 0 && - (st.st_size == -1 || addr + st.st_size > 0xf00000)) - addr = 0x1000000; - return (addr); -} - -int -main(void) -{ - int i; - - /* Set machine type to PC98_SYSTEM_PARAMETER. */ - set_machine_type(); - - /* Pick up arguments */ - kargs = (void *)__args; - initial_howto = kargs->howto; - initial_bootdev = kargs->bootdev; - initial_bootinfo = kargs->bootinfo ? (struct bootinfo *)PTOV(kargs->bootinfo) : NULL; - - /* Initialize the v86 register set to a known-good state. */ - bzero(&v86, sizeof(v86)); - v86.efl = PSL_RESERVED_DEFAULT | PSL_I; - - /* - * Initialise the heap as early as possible. Once this is done, malloc() is usable. - */ - bios_getmem(); - -#if defined(LOADER_BZIP2_SUPPORT) - if (high_heap_size > 0) { - heap_top = PTOV(high_heap_base + high_heap_size); - heap_bottom = PTOV(high_heap_base); - if (high_heap_base < memtop_copyin) - memtop_copyin = high_heap_base; - } else -#endif - { - heap_top = (void *)PTOV(bios_basemem); - heap_bottom = (void *)end; - } - setheap(heap_bottom, heap_top); - - /* - * XXX Chicken-and-egg problem; we want to have console output early, but some - * console attributes may depend on reading from eg. the boot device, which we - * can't do yet. - * - * We can use printf() etc. once this is done. - * If the previous boot stage has requested a serial console, prefer that. - */ - bi_setboothowto(initial_howto); - if (initial_howto & RB_MULTIPLE) { - if (initial_howto & RB_SERIAL) - setenv("console", "comconsole vidconsole", 1); - else - setenv("console", "vidconsole comconsole", 1); - } else if (initial_howto & RB_SERIAL) - setenv("console", "comconsole", 1); - else if (initial_howto & RB_MUTE) - setenv("console", "nullconsole", 1); - cons_probe(); - - /* - * Initialise the block cache. Set the upper limit. - */ - bcache_init(32768, 512); - - /* - * Special handling for PXE and CD booting. - */ - if (kargs->bootinfo == 0) { - /* - * We only want the PXE disk to try to init itself in the below - * walk through devsw if we actually booted off of PXE. - */ - if (kargs->bootflags & KARGS_FLAGS_PXE) - pxe_enable(kargs->pxeinfo ? PTOV(kargs->pxeinfo) : NULL); - else if (kargs->bootflags & KARGS_FLAGS_CD) - bc_add(initial_bootdev); - } - - archsw.arch_autoload = i386_autoload; - archsw.arch_getdev = i386_getdev; - archsw.arch_copyin = i386_copyin; - archsw.arch_copyout = i386_copyout; - archsw.arch_readin = i386_readin; - archsw.arch_isainb = isa_inb; - archsw.arch_isaoutb = isa_outb; - archsw.arch_loadaddr = pc98_loadaddr; - - /* - * March through the device switch probing for things. - */ - for (i = 0; devsw[i] != NULL; i++) - if (devsw[i]->dv_init != NULL) - (devsw[i]->dv_init)(); - printf("BIOS %dkB/%dkB available memory\n", bios_basemem / 1024, bios_extmem / 1024); - if (initial_bootinfo != NULL) { - initial_bootinfo->bi_basemem = bios_basemem / 1024; - initial_bootinfo->bi_extmem = bios_extmem / 1024; - } - - printf("\n%s", bootprog_info); - - extract_currdev(); /* set $currdev and $loaddev */ - setenv("LINES", "24", 1); /* optional */ - - interact(NULL); /* doesn't return */ - - /* if we ever get here, it is an error */ - return (1); -} - -/* - * Set the 'current device' by (if possible) recovering the boot device as - * supplied by the initial bootstrap. - * - * XXX should be extended for netbooting. - */ -static void -extract_currdev(void) -{ - struct i386_devdesc new_currdev; - int major; - int biosdev = -1; - - /* Assume we are booting from a BIOS disk by default */ - new_currdev.d_dev = &biosdisk; - - /* new-style boot loaders such as pxeldr and cdldr */ - if (kargs->bootinfo == 0) { - if ((kargs->bootflags & KARGS_FLAGS_CD) != 0) { - /* we are booting from a CD with cdboot */ - new_currdev.d_dev = &bioscd; - new_currdev.d_unit = bc_bios2unit(initial_bootdev); - } else if ((kargs->bootflags & KARGS_FLAGS_PXE) != 0) { - /* we are booting from pxeldr */ - new_currdev.d_dev = &pxedisk; - new_currdev.d_unit = 0; - } else { - /* we don't know what our boot device is */ - new_currdev.d_kind.biosdisk.slice = -1; - new_currdev.d_kind.biosdisk.partition = 0; - biosdev = -1; - } - } else if ((initial_bootdev & B_MAGICMASK) != B_DEVMAGIC) { - /* The passed-in boot device is bad */ - new_currdev.d_kind.biosdisk.slice = -1; - new_currdev.d_kind.biosdisk.partition = 0; - biosdev = -1; - } else { - new_currdev.d_kind.biosdisk.slice = B_SLICE(initial_bootdev) - 1; - new_currdev.d_kind.biosdisk.partition = B_PARTITION(initial_bootdev); - biosdev = initial_bootinfo->bi_bios_dev; - major = B_TYPE(initial_bootdev); - - /* - * If we are booted by an old bootstrap, we have to guess at the BIOS - * unit number. We will lose if there is more than one disk type - * and we are not booting from the lowest-numbered disk type - * (ie. SCSI when IDE also exists). - */ - if ((biosdev == 0) && (B_TYPE(initial_bootdev) != 2)) { /* biosdev doesn't match major */ - if (B_TYPE(initial_bootdev) == 6) - biosdev = 0x30 + B_UNIT(initial_bootdev); - else - biosdev = (major << 3) + 0x80 + B_UNIT(initial_bootdev); - } - } - new_currdev.d_type = new_currdev.d_dev->dv_type; - - /* - * If we are booting off of a BIOS disk and we didn't succeed in determining - * which one we booted off of, just use disk0: as a reasonable default. - */ - if ((new_currdev.d_type == biosdisk.dv_type) && - ((new_currdev.d_unit = bd_bios2unit(biosdev)) == -1)) { - printf("Can't work out which disk we are booting from.\n" - "Guessed BIOS device 0x%x not found by probes, defaulting to disk0:\n", biosdev); - new_currdev.d_unit = 0; - } - - env_setenv("currdev", EV_VOLATILE, i386_fmtdev(&new_currdev), - i386_setcurrdev, env_nounset); - env_setenv("loaddev", EV_VOLATILE, i386_fmtdev(&new_currdev), env_noset, - env_nounset); -} - -COMMAND_SET(reboot, "reboot", "reboot the system", command_reboot); - -static int -command_reboot(int argc, char *argv[]) -{ - int i; - - for (i = 0; devsw[i] != NULL; ++i) - if (devsw[i]->dv_cleanup != NULL) - (devsw[i]->dv_cleanup)(); - - printf("Rebooting...\n"); - delay(1000000); - __exit(0); -} - -/* provide this for panic, as it's not in the startup code */ -void -exit(int code) -{ - __exit(code); -} - -COMMAND_SET(heap, "heap", "show heap usage", command_heap); - -static int -command_heap(int argc, char *argv[]) -{ - mallocstats(); - printf("heap base at %p, top at %p, upper limit at %p\n", heap_bottom, - sbrk(0), heap_top); - return(CMD_OK); -} - -/* ISA bus access functions for PnP. */ -static int -isa_inb(int port) -{ - - return (inb(port)); -} - -static void -isa_outb(int port, int value) -{ - - outb(port, value); -} diff --git a/sys/boot/pc98/pc98boot/Makefile b/sys/boot/pc98/pc98boot/Makefile deleted file mode 100644 index f33b15f5db84..000000000000 --- a/sys/boot/pc98/pc98boot/Makefile +++ /dev/null @@ -1,25 +0,0 @@ -# $FreeBSD$ - -FILES= ${BOOT} -CLEANFILES= ${BOOT} ${BOOT}.part - -BOOT= pc98boot - -.if exists(${.OBJDIR}/../boot0) -BOOT0= ${.OBJDIR}/../boot0/boot0 -.else -BOOT0= ${.CURDIR}/../boot0/boot0 -.endif -.if exists(${.OBJDIR}/../boot0.5) -BOOT05= ${.OBJDIR}/../boot0.5/boot0.5 -.else -BOOT05= ${.CURDIR}/../boot0.5/boot0.5 -.endif - -${BOOT}: ${BOOT0} ${BOOT05} ${BOOT}.part - cat ${BOOT0} ${BOOT}.part ${BOOT05} > ${.TARGET} - -${BOOT}.part: - ${DD} if=/dev/zero of=${.TARGET} bs=512 count=1 - -.include <bsd.prog.mk> diff --git a/sys/cam/cam_xpt.c b/sys/cam/cam_xpt.c index 7754e9b1487a..ff08560e6428 100644 --- a/sys/cam/cam_xpt.c +++ b/sys/cam/cam_xpt.c @@ -2585,15 +2585,8 @@ xpt_action_default(union ccb *start_ccb) start_ccb->ccb_h.status = CAM_REQ_CMP; break; } -#if defined(PC98) || defined(__sparc64__) +#if defined(__sparc64__) /* - * In a PC-98 system, geometry translation depens on - * the "real" device geometry obtained from mode page 4. - * SCSI geometry translation is performed in the - * initialization routine of the SCSI BIOS and the result - * stored in host memory. If the translation is available - * in host memory, use it. If not, rely on the default - * translation the device driver performs. * For sparc64, we may need adjust the geometry of large * disks in order to fit the limitations of the 16-bit * fields of the VTOC8 disk label. @@ -3062,8 +3055,8 @@ call_sim: case XPT_TERM_IO: case XPT_ENG_INQ: /* XXX Implement */ - xpt_print_path(start_ccb->ccb_h.path); - printf("%s: CCB type %#x %s not supported\n", __func__, + xpt_print(start_ccb->ccb_h.path, + "%s: CCB type %#x %s not supported\n", __func__, start_ccb->ccb_h.func_code, xpt_action_name(start_ccb->ccb_h.func_code)); start_ccb->ccb_h.status = CAM_PROVIDE_FAIL; @@ -3944,8 +3937,8 @@ xpt_bus_register(struct cam_sim *sim, device_t parent, u_int32_t bus) } } if (new_bus->xport == NULL) { - xpt_print_path(path); - printf("No transport found for %d\n", cpi.transport); + xpt_print(path, + "No transport found for %d\n", cpi.transport); xpt_release_bus(new_bus); free(path, M_CAMXPT); return (CAM_RESRC_UNAVAIL); diff --git a/sys/conf/Makefile.pc98 b/sys/conf/Makefile.pc98 deleted file mode 100644 index 1bd5bae805f7..000000000000 --- a/sys/conf/Makefile.pc98 +++ /dev/null @@ -1,52 +0,0 @@ -# Makefile for FreeBSD(98) after: -# -# Makefile.i386 -- with config changes. -# Copyright 1990 W. Jolitz -# from: @(#)Makefile.i386 7.1 5/10/91 -# $FreeBSD$ -# -# Makefile for FreeBSD -# -# This makefile is constructed from a machine description: -# config machineid -# Most changes should be made in the machine description -# /sys/pc98/conf/``machineid'' -# after which you should do -# config machineid -# Generic makefile changes should be made in -# /sys/conf/Makefile.pc98 -# after which config should be rerun for all machines. -# - -# Which version of config(8) is required. -%VERSREQ= 600012 - -.if !defined(S) -.if exists(./@/.) -S= ./@ -.else -S= ../../.. -.endif -.endif - -LDSCRIPT_NAME?= ldscript.${MACHINE_ARCH} - -.include "$S/conf/kern.pre.mk" - -ASM_CFLAGS.mpboot.s= ${CLANG_NO_IAS34} - -%BEFORE_DEPEND - -%OBJS - -%FILES.c - -%FILES.s - -%FILES.m - -%CLEAN - -%RULES - -.include "$S/conf/kern.post.mk" diff --git a/sys/conf/NOTES b/sys/conf/NOTES index c8ac5de69ae5..ed8566acacea 100644 --- a/sys/conf/NOTES +++ b/sys/conf/NOTES @@ -169,9 +169,7 @@ options GEOM_PART_EBR_COMPAT # Backward compatible partition names options GEOM_PART_GPT # GPT partitioning options GEOM_PART_LDM # Logical Disk Manager options GEOM_PART_MBR # MBR partitioning -options GEOM_PART_PC98 # PC-9800 disk partitioning options GEOM_PART_VTOC8 # SMI VTOC8 disk label -options GEOM_PC98 # NEC PC9800 partitioning options GEOM_RAID # Soft RAID functionality. options GEOM_RAID3 # RAID3 functionality. options GEOM_SHSEC # Shared secret. @@ -1535,7 +1533,7 @@ options TERMINAL_KERN_ATTR=(FG_LIGHTRED|BG_BLACK) # ahc: Adaptec 274x/284x/2910/293x/294x/394x/3950x/3960x/398X/4944/ # 19160x/29160x, aic7770/aic78xx # ahd: Adaptec 29320/39320 Controllers. -# aic: Adaptec 6260/6360, APA-1460 (PC Card), NEC PC9801-100 (C-BUS) +# aic: Adaptec 6260/6360, APA-1460 (PC Card) # bt: Most Buslogic controllers: including BT-445, BT-54x, BT-64x, BT-74x, # BT-75x, BT-946, BT-948, BT-956, BT-958, SDC3211B, SDC3211F, SDC3222F # esp: Emulex ESP, NCR 53C9x and QLogic FAS families based controllers @@ -1759,7 +1757,6 @@ device ata # Modular ATA #device atacore # Core ATA functionality #device atacard # CARDBUS support -#device atabus # PC98 cbus support #device ataisa # ISA bus support #device atapci # PCI bus support; only generic chipset support @@ -2838,7 +2835,7 @@ options U3G_DEBUG # options for ukbd: options UKBD_DFLT_KEYMAP # specify the built-in keymap -makeoptions UKBD_DFLT_KEYMAP=jp.pc98 +makeoptions UKBD_DFLT_KEYMAP=jp # options for uplcom: options UPLCOM_INTR_INTERVAL=100 # interrupt pipe interval diff --git a/sys/conf/config.mk b/sys/conf/config.mk index 50294961ca12..c519980d088e 100644 --- a/sys/conf/config.mk +++ b/sys/conf/config.mk @@ -38,7 +38,6 @@ opt_wlan.h: echo "#define IEEE80211_AMPDU_AGE 1" >> ${.TARGET} echo "#define IEEE80211_SUPPORT_MESH 1" >> ${.TARGET} KERN_OPTS.i386=NEW_PCIB DEV_PCI -KERN_OPTS.pc98=NEW_PCIB DEV_PCI KERN_OPTS.amd64=NEW_PCIB DEV_PCI KERN_OPTS.powerpc=NEW_PCIB DEV_PCI KERN_OPTS=MROUTING NATM IEEE80211_DEBUG \ diff --git a/sys/conf/dtb.mk b/sys/conf/dtb.mk index f32b0202b94a..81c98ef0ad36 100644 --- a/sys/conf/dtb.mk +++ b/sys/conf/dtb.mk @@ -76,3 +76,4 @@ _dtbinstall: .include <bsd.dep.mk> .include <bsd.obj.mk> +.include <bsd.links.mk> diff --git a/sys/conf/files b/sys/conf/files index 3f01e9d4eee6..3009d1515315 100644 --- a/sys/conf/files +++ b/sys/conf/files @@ -111,7 +111,7 @@ cam/ctl/ctl_error.c optional ctl cam/ctl/ctl_util.c optional ctl cam/ctl/scsi_ctl.c optional ctl cam/scsi/scsi_da.c optional da -cam/scsi/scsi_low.c optional ct | ncv | nsp | stg +cam/scsi/scsi_low.c optional ncv | nsp | stg cam/scsi/scsi_pass.c optional pass cam/scsi/scsi_pt.c optional pt cam/scsi/scsi_sa.c optional sa @@ -789,7 +789,6 @@ dev/ata/ata-dma.c optional ata | atacore dev/ata/ata-lowlevel.c optional ata | atacore dev/ata/ata-sata.c optional ata | atacore dev/ata/ata-card.c optional ata pccard | atapccard -dev/ata/ata-cbus.c optional ata pc98 | atapc98 dev/ata/ata-isa.c optional ata isa | ataisa dev/ata/ata-pci.c optional ata pci | atapci dev/ata/chipsets/ata-acard.c optional ata pci | ataacard @@ -3458,8 +3457,6 @@ geom/geom_kern.c standard geom/geom_map.c optional geom_map geom/geom_mbr.c optional geom_mbr geom/geom_mbr_enc.c optional geom_mbr -geom/geom_pc98.c optional geom_pc98 -geom/geom_pc98_enc.c optional geom_pc98 geom/geom_redboot.c optional geom_redboot geom/geom_slice.c standard geom/geom_subr.c standard @@ -3493,7 +3490,6 @@ geom/part/g_part_ebr.c optional geom_part_ebr geom/part/g_part_gpt.c optional geom_part_gpt geom/part/g_part_ldm.c optional geom_part_ldm geom/part/g_part_mbr.c optional geom_part_mbr -geom/part/g_part_pc98.c optional geom_part_pc98 geom/part/g_part_vtoc8.c optional geom_part_vtoc8 geom/raid/g_raid.c optional geom_raid geom/raid/g_raid_ctl.c optional geom_raid diff --git a/sys/conf/files.amd64 b/sys/conf/files.amd64 index bb6d2db54e20..a2a68a19cb01 100644 --- a/sys/conf/files.amd64 +++ b/sys/conf/files.amd64 @@ -606,7 +606,7 @@ contrib/x86emu/x86emu.c optional x86bios | dpms | pci | vesa dev/bvm/bvm_console.c optional bvmconsole dev/bvm/bvm_dbg.c optional bvmdebug # -# x86 shared code between IA32, AMD64 and PC98 architectures +# x86 shared code between IA32 and AMD64 architectures # x86/acpica/OsdEnvironment.c optional acpi x86/acpica/acpi_apm.c optional acpi diff --git a/sys/conf/files.i386 b/sys/conf/files.i386 index 1add0b800871..c0b75d7e1894 100644 --- a/sys/conf/files.i386 +++ b/sys/conf/files.i386 @@ -578,7 +578,7 @@ compat/x86bios/x86bios.c optional x86bios | dpms | pci | vesa dev/bvm/bvm_console.c optional bvmconsole dev/bvm/bvm_dbg.c optional bvmdebug # -# x86 shared code between IA32, AMD64 and PC98 architectures +# x86 shared code between IA32 and AMD64 architectures # x86/acpica/OsdEnvironment.c optional acpi x86/acpica/acpi_apm.c optional acpi diff --git a/sys/conf/files.pc98 b/sys/conf/files.pc98 deleted file mode 100644 index 8a7dc98689e5..000000000000 --- a/sys/conf/files.pc98 +++ /dev/null @@ -1,279 +0,0 @@ -# This file tells config what files go into building a kernel, -# files marked standard are always included. -# -# modified for PC-9801/PC-9821 -# -# $FreeBSD$ -# -# The long compile-with and dependency lines are required because of -# limitations in config: backslash-newline doesn't work in strings, and -# dependency lines other than the first are silently ignored. -# -linux_genassym.o optional compat_linux \ - dependency "$S/i386/linux/linux_genassym.c" \ - compile-with "${CC} ${CFLAGS:N-fno-common} -c ${.IMPSRC}" \ - no-obj no-implicit-rule \ - clean "linux_genassym.o" -# -linux_assym.h optional compat_linux \ - dependency "$S/kern/genassym.sh linux_genassym.o" \ - compile-with "sh $S/kern/genassym.sh linux_genassym.o > ${.TARGET}" \ - no-obj no-implicit-rule before-depend \ - clean "linux_assym.h" -# -linux_locore.o optional compat_linux \ - dependency "linux_assym.h $S/i386/linux/linux_locore.s" \ - compile-with "${CC} -x assembler-with-cpp -DLOCORE -shared -s -pipe -I. -I$S -Werror -Wall -fno-common -nostdinc -nostdlib -Wl,-T$S/i386/linux/linux_vdso.lds.s -Wl,-soname=linux_vdso.so,--eh-frame-hdr,-fPIC,-warn-common ${.IMPSRC} -o ${.TARGET}" \ - no-obj no-implicit-rule \ - clean "linux_locore.o" -# -linux_vdso.so optional compat_linux \ - dependency "linux_locore.o" \ - compile-with "${OBJCOPY} --input-target binary --output-target elf32-i386-freebsd --binary-architecture i386 linux_locore.o ${.TARGET}" \ - no-implicit-rule \ - clean "linux_vdso.so" -# -svr4_genassym.o optional compat_svr4 \ - dependency "$S/i386/svr4/svr4_genassym.c" \ - compile-with "${CC} ${CFLAGS:N-fno-common} -c ${.IMPSRC}" \ - no-obj no-implicit-rule \ - clean "svr4_genassym.o" -# -svr4_assym.h optional compat_svr4 \ - dependency "$S/kern/genassym.sh svr4_genassym.o" \ - compile-with "sh $S/kern/genassym.sh svr4_genassym.o > ${.TARGET}" \ - no-obj no-implicit-rule before-depend \ - clean "svr4_assym.h" -# -ukbdmap.h optional ukbd_dflt_keymap \ - compile-with "kbdcontrol -P ${S:S/sys$/share/}/vt/keymaps -P ${S:S/sys$/share/}/syscons/keymaps -L ${UKBD_DFLT_KEYMAP} | sed -e 's/^static keymap_t.* = /static keymap_t key_map = /' -e 's/^static accentmap_t.* = /static accentmap_t accent_map = /' > ukbdmap.h" \ - no-obj no-implicit-rule before-depend \ - clean "ukbdmap.h" -# -cddl/contrib/opensolaris/common/atomic/i386/opensolaris_atomic.S optional zfs compile-with "${ZFS_S}" -compat/linprocfs/linprocfs.c optional linprocfs -compat/linsysfs/linsysfs.c optional linsysfs -compat/linux/linux_event.c optional compat_linux -compat/linux/linux_emul.c optional compat_linux -compat/linux/linux_file.c optional compat_linux -compat/linux/linux_fork.c optional compat_linux -compat/linux/linux_futex.c optional compat_linux -compat/linux/linux_getcwd.c optional compat_linux -compat/linux/linux_ioctl.c optional compat_linux -compat/linux/linux_ipc.c optional compat_linux -compat/linux/linux_mib.c optional compat_linux -compat/linux/linux_misc.c optional compat_linux -compat/linux/linux_mmap.c optional compat_linux -compat/linux/linux_signal.c optional compat_linux -compat/linux/linux_socket.c optional compat_linux -compat/linux/linux_stats.c optional compat_linux -compat/linux/linux_sysctl.c optional compat_linux -compat/linux/linux_time.c optional compat_linux -compat/linux/linux_timer.c optional compat_linux -compat/linux/linux_uid16.c optional compat_linux -compat/linux/linux_util.c optional compat_linux -compat/linux/linux_vdso.c optional compat_linux -compat/linux/linux.c optional compat_linux -compat/svr4/imgact_svr4.c optional compat_svr4 -compat/svr4/svr4_fcntl.c optional compat_svr4 -compat/svr4/svr4_filio.c optional compat_svr4 -compat/svr4/svr4_ioctl.c optional compat_svr4 -compat/svr4/svr4_ipc.c optional compat_svr4 -compat/svr4/svr4_misc.c optional compat_svr4 -compat/svr4/svr4_resource.c optional compat_svr4 -compat/svr4/svr4_signal.c optional compat_svr4 -compat/svr4/svr4_socket.c optional compat_svr4 -compat/svr4/svr4_sockio.c optional compat_svr4 -compat/svr4/svr4_stat.c optional compat_svr4 -compat/svr4/svr4_stream.c optional compat_svr4 -compat/svr4/svr4_syscallnames.c optional compat_svr4 -compat/svr4/svr4_sysent.c optional compat_svr4 -compat/svr4/svr4_sysvec.c optional compat_svr4 -compat/svr4/svr4_termios.c optional compat_svr4 -bf_enc.o optional crypto | ipsec \ - dependency "$S/crypto/blowfish/arch/i386/bf_enc.S $S/crypto/blowfish/arch/i386/bf_enc_586.S $S/crypto/blowfish/arch/i386/bf_enc_686.S" \ - compile-with "${CC} -c -I$S/crypto/blowfish/arch/i386 ${ASM_CFLAGS} ${WERROR} ${.IMPSRC}" \ - no-implicit-rule -crypto/des/arch/i386/des_enc.S optional crypto | ipsec | netsmb -dev/agp/agp_ali.c optional agp -dev/agp/agp_amd.c optional agp -dev/agp/agp_i810.c optional agp -dev/agp/agp_intel.c optional agp -dev/agp/agp_nvidia.c optional agp -dev/agp/agp_sis.c optional agp -dev/agp/agp_via.c optional agp -dev/aic/aic_cbus.c optional aic isa -dev/ce/ceddk.c optional ce -dev/ce/if_ce.c optional ce -dev/ce/tau32-ddk.c optional ce \ - compile-with "${NORMAL_C} ${NO_WCONSTANT_CONVERSION}" -dev/cp/cpddk.c optional cp -dev/cp/if_cp.c optional cp -dev/ct/bshw_machdep.c optional ct -dev/ct/ct.c optional ct -dev/ct/ct_isa.c optional ct isa -dev/ed/if_ed_cbus.c optional ed isa -dev/ed/if_ed_wd80x3.c optional ed isa -dev/fb/fb.c optional fb | gdc -dev/fdc/fdc.c optional fdc -dev/fdc/fdc_cbus.c optional fdc isa -dev/fe/if_fe_cbus.c optional fe isa -dev/hwpmc/hwpmc_amd.c optional hwpmc -dev/hwpmc/hwpmc_intel.c optional hwpmc -dev/hwpmc/hwpmc_core.c optional hwpmc -dev/hwpmc/hwpmc_uncore.c optional hwpmc -dev/hwpmc/hwpmc_pentium.c optional hwpmc -dev/hwpmc/hwpmc_piv.c optional hwpmc -dev/hwpmc/hwpmc_ppro.c optional hwpmc -dev/hwpmc/hwpmc_tsc.c optional hwpmc -dev/hwpmc/hwpmc_x86.c optional hwpmc -dev/io/iodev.c optional io -dev/le/if_le_cbus.c optional le isa -dev/mse/mse.c optional mse -dev/mse/mse_cbus.c optional mse isa -dev/sbni/if_sbni.c optional sbni -dev/sbni/if_sbni_pci.c optional sbni pci -dev/sio/sio_pccard.c optional sio pccard -dev/sio/sio_pci.c optional sio pci -dev/sio/sio_puc.c optional sio puc -dev/snc/dp83932.c optional snc -dev/snc/dp83932subr.c optional snc -dev/snc/if_snc.c optional snc -dev/snc/if_snc_cbus.c optional snc isa -dev/snc/if_snc_pccard.c optional snc pccard -dev/speaker/spkr.c optional speaker -dev/syscons/apm/apm_saver.c optional apm_saver apm -dev/uart/uart_cpu_pc98.c optional uart -i386/bios/apm.c optional apm -#i386/i386/apic_vector.s optional apic -i386/i386/atomic.c standard \ - compile-with "${CC} -c ${CFLAGS} ${DEFINED_PROF:S/^$/-fomit-frame-pointer/} ${.IMPSRC}" -i386/i386/bios.c standard -i386/i386/bioscall.s standard -i386/i386/bpf_jit_machdep.c optional bpf_jitter -i386/i386/db_disasm.c optional ddb -i386/i386/db_interface.c optional ddb -i386/i386/db_trace.c optional ddb -i386/i386/elf_machdep.c standard -i386/i386/exception.s standard -i386/i386/gdb_machdep.c optional gdb -i386/i386/i686_mem.c optional mem -i386/i386/in_cksum.c optional inet | inet6 -i386/i386/initcpu.c standard -i386/i386/io.c optional io -i386/i386/k6_mem.c optional mem -i386/i386/locore.s standard no-obj -i386/i386/machdep.c standard -i386/i386/mem.c optional mem -i386/i386/minidump_machdep.c standard -i386/i386/mp_clock.c optional smp -i386/i386/mp_machdep.c optional smp -i386/i386/mpboot.s optional smp -i386/i386/perfmon.c optional perfmon -i386/i386/pmap.c standard -i386/i386/ptrace_machdep.c standard -i386/i386/support.s standard -i386/i386/swtch.s standard -i386/i386/sys_machdep.c standard -i386/i386/trap.c standard -i386/i386/uio_machdep.c standard -i386/i386/vm86.c standard -i386/i386/vm_machdep.c standard -i386/ibcs2/ibcs2_errno.c optional ibcs2 -i386/ibcs2/ibcs2_fcntl.c optional ibcs2 -i386/ibcs2/ibcs2_ioctl.c optional ibcs2 -i386/ibcs2/ibcs2_ipc.c optional ibcs2 -i386/ibcs2/ibcs2_isc.c optional ibcs2 -i386/ibcs2/ibcs2_isc_sysent.c optional ibcs2 -i386/ibcs2/ibcs2_misc.c optional ibcs2 -i386/ibcs2/ibcs2_msg.c optional ibcs2 -i386/ibcs2/ibcs2_other.c optional ibcs2 -i386/ibcs2/ibcs2_signal.c optional ibcs2 -i386/ibcs2/ibcs2_socksys.c optional ibcs2 -i386/ibcs2/ibcs2_stat.c optional ibcs2 -i386/ibcs2/ibcs2_sysent.c optional ibcs2 -i386/ibcs2/ibcs2_sysi86.c optional ibcs2 -i386/ibcs2/ibcs2_sysvec.c optional ibcs2 -i386/ibcs2/ibcs2_util.c optional ibcs2 -i386/ibcs2/ibcs2_xenix.c optional ibcs2 -i386/ibcs2/ibcs2_xenix_sysent.c optional ibcs2 -i386/ibcs2/imgact_coff.c optional ibcs2 -i386/isa/elink.c optional ep | ie -i386/isa/npx.c optional npx -i386/isa/pmtimer.c optional pmtimer -i386/isa/prof_machdep.c optional profiling-routine -i386/linux/imgact_linux.c optional compat_linux -i386/linux/linux_dummy.c optional compat_linux -i386/linux/linux_machdep.c optional compat_linux -i386/linux/linux_ptrace.c optional compat_linux -i386/linux/linux_support.s optional compat_linux \ - dependency "linux_assym.h" -i386/linux/linux_sysent.c optional compat_linux -i386/linux/linux_sysvec.c optional compat_linux -i386/pci/pci_cfgreg.c optional pci -i386/pci/pci_pir.c optional pci -i386/svr4/svr4_locore.s optional compat_svr4 \ - dependency "svr4_assym.h" \ - warning "COMPAT_SVR4 is broken and should be avoided" -i386/svr4/svr4_machdep.c optional compat_svr4 -kern/kern_clocksource.c standard -kern/imgact_aout.c optional compat_aout -kern/imgact_gzip.c optional gzip -kern/subr_sfbuf.c standard -libkern/divdi3.c standard -libkern/ffsll.c standard -libkern/flsll.c standard -libkern/memmove.c standard -libkern/memset.c standard -libkern/moddi3.c standard -libkern/qdivrem.c standard -libkern/ucmpdi2.c standard -libkern/udivdi3.c standard -libkern/umoddi3.c standard -pc98/apm/apm_bioscall.S optional apm -pc98/cbus/cbus_dma.c optional isa -pc98/cbus/gdc.c optional gdc -pc98/cbus/nmi.c standard -pc98/cbus/olpt.c optional olpt -pc98/cbus/pckbd.c optional pckbd -pc98/cbus/pcrtc.c standard -pc98/cbus/pmc.c optional pmc -pc98/cbus/scgdcrndr.c optional sc gdc -pc98/cbus/scterm-sck.c optional sc -pc98/cbus/scvtb.c optional sc -pc98/cbus/sio.c optional sio -pc98/cbus/sio_cbus.c optional sio isa -pc98/cbus/syscons_cbus.c optional sc -pc98/pc98/busio.s standard -pc98/pc98/busiosubr.c standard -pc98/pc98/canbepm.c optional canbepm -pc98/pc98/canbus.c optional canbus -pc98/pc98/canbus_if.m optional canbus -pc98/pc98/pc98_machdep.c standard -# -# x86 shared code between IA32, AMD64 and PC98 architectures -# -x86/isa/atpic.c optional atpic -x86/isa/clock.c standard -x86/isa/isa.c optional isa -x86/pci/pci_bus.c optional pci -x86/x86/autoconf.c standard -x86/x86/busdma_bounce.c standard -x86/x86/busdma_machdep.c standard -x86/x86/cpu_machdep.c standard -x86/x86/dump_machdep.c standard -x86/x86/identcpu.c standard -x86/x86/intr_machdep.c standard -x86/x86/io_apic.c optional apic -x86/x86/legacy.c standard -x86/x86/local_apic.c optional apic -x86/x86/mca.c standard -x86/x86/mptable.c optional apic -x86/x86/mptable_pci.c optional apic pci -x86/x86/mp_x86.c optional smp -x86/x86/mp_watchdog.c optional mp_watchdog smp -x86/x86/msi.c optional apic pci -x86/x86/nexus.c standard -x86/x86/stack_machdep.c optional ddb | stack -x86/x86/tsc.c standard -x86/x86/delay.c standard diff --git a/sys/conf/options b/sys/conf/options index beea9bd507d3..e59f0c76a822 100644 --- a/sys/conf/options +++ b/sys/conf/options @@ -130,9 +130,7 @@ GEOM_PART_EBR_COMPAT opt_geom.h GEOM_PART_GPT opt_geom.h GEOM_PART_LDM opt_geom.h GEOM_PART_MBR opt_geom.h -GEOM_PART_PC98 opt_geom.h GEOM_PART_VTOC8 opt_geom.h -GEOM_PC98 opt_geom.h GEOM_RAID opt_geom.h GEOM_RAID3 opt_geom.h GEOM_SHSEC opt_geom.h diff --git a/sys/conf/options.pc98 b/sys/conf/options.pc98 deleted file mode 100644 index a19ebd11271b..000000000000 --- a/sys/conf/options.pc98 +++ /dev/null @@ -1,104 +0,0 @@ -# $FreeBSD$ -# Options specific to the pc98 platform kernels - -AUTO_EOI_1 opt_auto_eoi.h -BROKEN_KEYBOARD_RESET opt_reset.h -COUNT_XINVLTLB_HITS opt_smp.h -COUNT_IPIS opt_smp.h -DISABLE_PG_G opt_pmap.h -DISABLE_PSE opt_pmap.h -I586_PMC_GUPROF opt_i586_guprof.h -MAXMEM -MPTABLE_FORCE_HTT -MP_WATCHDOG -PERFMON -PMAP_SHPGPERPROC opt_pmap.h -POWERFAIL_NMI opt_trap.h - -# Options for emulators. These should only be used at config time, so -# they are handled like options for static filesystems -# (see src/sys/conf/options), except for broken debugging options. -COMPAT_AOUT opt_dontuse.h -IBCS2 opt_dontuse.h -COMPAT_LINUX opt_dontuse.h -COMPAT_SVR4 opt_dontuse.h -DEBUG_SVR4 opt_svr4.h -LINPROCFS opt_dontuse.h -LINSYSFS opt_dontuse.h - -# Change KVM size. Changes things all over the kernel. -KVA_PAGES opt_global.h - -TIMER_FREQ opt_clock.h - -CPU_BLUELIGHTNING_3X opt_cpu.h -CPU_BLUELIGHTNING_FPU_OP_CACHE opt_cpu.h -CPU_BTB_EN opt_cpu.h -CPU_CYRIX_NO_LOCK opt_cpu.h -CPU_DIRECT_MAPPED_CACHE opt_cpu.h -CPU_DISABLE_5X86_LSSER opt_cpu.h -CPU_DISABLE_CMPXCHG opt_global.h # XXX global, unlike other CPU_* -CPU_DISABLE_SSE opt_cpu.h -CPU_FASTER_5X86_FPU opt_cpu.h -CPU_GEODE opt_cpu.h -CPU_I486_ON_386 opt_cpu.h -CPU_IORT opt_cpu.h -CPU_L2_LATENCY opt_cpu.h -CPU_LOOP_EN opt_cpu.h -CPU_PPRO2CELERON opt_cpu.h -CPU_RSTK_EN opt_cpu.h -CPU_SOEKRIS opt_cpu.h -CPU_SUSP_HLT opt_cpu.h -CPU_UPGRADE_HW_CACHE opt_cpu.h -CPU_WT_ALLOC opt_cpu.h -CYRIX_CACHE_REALLY_WORKS opt_cpu.h -CYRIX_CACHE_WORKS opt_cpu.h -NO_F00F_HACK opt_cpu.h -NO_MEMORY_HOLE opt_cpu.h - -# The CPU type affects the endian conversion functions all over the kernel. -I486_CPU opt_global.h -I586_CPU opt_global.h -I686_CPU opt_global.h - -# options for serial support -COM_ESP opt_sio.h -COM_MULTIPORT opt_sio.h -CONSPEED opt_sio.h -GDBSPEED opt_sio.h - -GDC - -# AGP debugging support -AGP_DEBUG opt_agp.h - -# Video spigot -SPIGOT_UNSECURE opt_spigot.h - -# Enables NETGRAPH support for Cronyx adapters -NETGRAPH_CRONYX opt_ng_cronyx.h - -# ct driver options -CT_BUS_WEIGHT opt_ct.h -CT_USE_RELOCATE_OFFSET opt_ct.h - -# npx options -FPU_ERROR_BROKEN opt_npx.h - -# PC98 options -EPSON_BOUNCEDMA opt_pc98.h -EPSON_MEMWIN opt_pc98.h -LINE30 opt_syscons.h -PC98 opt_global.h - -# Device options -DEV_APIC opt_apic.h -DEV_ATPIC opt_atpic.h -DEV_MECIA opt_mecia.h -DEV_NPX opt_npx.h - -# Debugging -NPX_DEBUG opt_npx.h - -# BPF just-in-time compiler -BPF_JITTER opt_bpf.h diff --git a/sys/crypto/aesni/aesni.h b/sys/crypto/aesni/aesni.h index c3e113d12001..8b40e1ab0fec 100644 --- a/sys/crypto/aesni/aesni.h +++ b/sys/crypto/aesni/aesni.h @@ -35,7 +35,7 @@ #include <opencrypto/cryptodev.h> -#if defined(__amd64__) || (defined(__i386__) && !defined(PC98)) +#if defined(__amd64__) || defined(__i386__) #include <machine/cpufunc.h> #include <machine/cputypes.h> #include <machine/md_var.h> diff --git a/sys/crypto/via/padlock.c b/sys/crypto/via/padlock.c index 65a7b5dd9fb5..f6c6d77f6cb7 100644 --- a/sys/crypto/via/padlock.c +++ b/sys/crypto/via/padlock.c @@ -35,7 +35,7 @@ __FBSDID("$FreeBSD$"); #include <sys/rwlock.h> #include <sys/malloc.h> #include <sys/libkern.h> -#if defined(__amd64__) || (defined(__i386__) && !defined(PC98)) +#if defined(__amd64__) || defined(__i386__) #include <machine/cpufunc.h> #include <machine/cputypes.h> #include <machine/md_var.h> @@ -85,7 +85,7 @@ padlock_probe(device_t dev) { char capp[256]; -#if defined(__amd64__) || (defined(__i386__) && !defined(PC98)) +#if defined(__amd64__) || defined(__i386__) /* If there is no AES support, we has nothing to do here. */ if (!(via_feature_xcrypt & VIA_HAS_AES)) { device_printf(dev, "No ACE support.\n"); diff --git a/sys/crypto/via/padlock_hash.c b/sys/crypto/via/padlock_hash.c index c952b63503ea..658043b4946a 100644 --- a/sys/crypto/via/padlock_hash.c +++ b/sys/crypto/via/padlock_hash.c @@ -35,7 +35,7 @@ __FBSDID("$FreeBSD$"); #include <sys/libkern.h> #include <sys/endian.h> #include <sys/pcpu.h> -#if defined(__amd64__) || (defined(__i386__) && !defined(PC98)) +#if defined(__amd64__) || defined(__i386__) #include <machine/cpufunc.h> #include <machine/cputypes.h> #include <machine/md_var.h> diff --git a/sys/dev/aic/aic_cbus.c b/sys/dev/aic/aic_cbus.c deleted file mode 100644 index 84e7f7bf4e9d..000000000000 --- a/sys/dev/aic/aic_cbus.c +++ /dev/null @@ -1,265 +0,0 @@ -/*- - * Copyright (c) 1999 Luoqi Chen. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#include <sys/param.h> -#include <sys/callout.h> -#include <sys/kernel.h> -#include <sys/lock.h> -#include <sys/module.h> -#include <sys/mutex.h> -#include <sys/bus.h> - -#include <machine/bus.h> -#include <machine/resource.h> -#include <sys/rman.h> - -#include <isa/isavar.h> -#include <dev/aic/aic6360reg.h> -#include <dev/aic/aicvar.h> - -struct aic_isa_softc { - struct aic_softc sc_aic; - struct resource *sc_port; - struct resource *sc_irq; - struct resource *sc_drq; - void *sc_ih; -}; - -static int aic_isa_alloc_resources(device_t); -static void aic_isa_release_resources(device_t); -static int aic_isa_probe(device_t); -static int aic_isa_attach(device_t); - -static u_int aic_isa_ports[] = { 0x1840 }; - -#define AIC_ISA_NUMPORTS nitems(aic_isa_ports) -#define AIC_ISA_PORTSIZE 0x20 - -#define AIC98_GENERIC 0x00 -#define AIC98_NEC100 0x01 -#define AIC_TYPE98(x) (((x) >> 16) & 0x01) - -static bus_addr_t aicport_generic[AIC_ISA_PORTSIZE] = { - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, - 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, - 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, - 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, -}; -static bus_addr_t aicport_100[AIC_ISA_PORTSIZE] = { - 0x00, 0x02, 0x04, 0x06, 0x08, 0x0a, 0x0c, 0x0e, - 0x10, 0x12, 0x14, 0x16, 0x18, 0x1a, 0x1c, 0x1e, - 0x20, 0x22, 0x24, 0x26, 0x28, 0x2a, 0x2c, 0x2e, - 0x30, 0x32, 0x34, 0x36, 0x38, 0x3a, 0x3c, 0x3e, -}; - -static struct isa_pnp_id aic_ids[] = { - { 0xa180a3b8, "NEC PC9801-100" }, - { 0 } -}; - -static int -aic_isa_alloc_resources(device_t dev) -{ - struct aic_isa_softc *sc = device_get_softc(dev); - int rid; - bus_addr_t *bs_iat; - - if ((isa_get_logicalid(dev) == 0xa180a3b8) || - (AIC_TYPE98(device_get_flags(dev)) == AIC98_NEC100)) - bs_iat = aicport_100; - else - bs_iat = aicport_generic; - - sc->sc_port = sc->sc_irq = sc->sc_drq = NULL; - - rid = 0; - sc->sc_port = isa_alloc_resourcev(dev, SYS_RES_IOPORT, &rid, - bs_iat, AIC_ISA_PORTSIZE, RF_ACTIVE); - if (!sc->sc_port) { - device_printf(dev, "I/O port allocation failed\n"); - return (ENOMEM); - } - isa_load_resourcev(sc->sc_port, bs_iat, AIC_ISA_PORTSIZE); - mtx_init(&sc->sc_aic.lock, "aic", NULL, MTX_DEF); - - if (isa_get_irq(dev) != -1) { - rid = 0; - sc->sc_irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid, - RF_ACTIVE); - if (!sc->sc_irq) { - device_printf(dev, "IRQ allocation failed\n"); - aic_isa_release_resources(dev); - return (ENOMEM); - } - } - - if (isa_get_drq(dev) != -1) { - rid = 0; - sc->sc_drq = bus_alloc_resource_any(dev, SYS_RES_DRQ, &rid, - RF_ACTIVE); - if (!sc->sc_drq) { - device_printf(dev, "DRQ allocation failed\n"); - aic_isa_release_resources(dev); - return (ENOMEM); - } - } - - sc->sc_aic.dev = dev; - sc->sc_aic.res = sc->sc_port; - return (0); -} - -static void -aic_isa_release_resources(device_t dev) -{ - struct aic_isa_softc *sc = device_get_softc(dev); - - if (sc->sc_port) - bus_release_resource(dev, SYS_RES_IOPORT, 0, sc->sc_port); - if (sc->sc_irq) - bus_release_resource(dev, SYS_RES_IRQ, 0, sc->sc_irq); - if (sc->sc_drq) - bus_release_resource(dev, SYS_RES_DRQ, 0, sc->sc_drq); - sc->sc_port = sc->sc_irq = sc->sc_drq = NULL; - mtx_destroy(&sc->sc_aic.lock); -} - -static int -aic_isa_probe(device_t dev) -{ - struct aic_isa_softc *sc = device_get_softc(dev); - struct aic_softc *aic = &sc->sc_aic; - int numports, i; - u_int port, *ports; - u_int8_t porta; - - if (ISA_PNP_PROBE(device_get_parent(dev), dev, aic_ids) == ENXIO) - return (ENXIO); - - port = isa_get_port(dev); - if (port != -1) { - ports = &port; - numports = 1; - } else { - ports = aic_isa_ports; - numports = AIC_ISA_NUMPORTS; - } - - for (i = 0; i < numports; i++) { - if (bus_set_resource(dev, SYS_RES_IOPORT, 0, ports[i], 1)) - continue; - if (aic_isa_alloc_resources(dev)) - continue; - if (aic_probe(aic) == 0) - break; - aic_isa_release_resources(dev); - } - - if (i == numports) - return (ENXIO); - - porta = aic_inb(aic, PORTA); - aic_isa_release_resources(dev); - if (isa_get_irq(dev) == -1) - bus_set_resource(dev, SYS_RES_IRQ, 0, PORTA_IRQ(porta), 1); - if ((aic->flags & AIC_DMA_ENABLE) && isa_get_drq(dev) == -1) - bus_set_resource(dev, SYS_RES_DRQ, 0, PORTA_DRQ(porta), 1); - device_set_desc(dev, "Adaptec 6260/6360 SCSI controller"); - return (0); -} - -static int -aic_isa_attach(device_t dev) -{ - struct aic_isa_softc *sc = device_get_softc(dev); - struct aic_softc *aic = &sc->sc_aic; - int error; - - error = aic_isa_alloc_resources(dev); - if (error) { - device_printf(dev, "resource allocation failed\n"); - return (error); - } - - error = aic_attach(aic); - if (error) { - device_printf(dev, "attach failed\n"); - aic_isa_release_resources(dev); - return (error); - } - - error = bus_setup_intr(dev, sc->sc_irq, INTR_TYPE_CAM | INTR_ENTROPY | - INTR_MPSAFE, NULL, aic_intr, aic, &sc->sc_ih); - if (error) { - device_printf(dev, "failed to register interrupt handler\n"); - aic_isa_release_resources(dev); - return (error); - } - return (0); -} - -static int -aic_isa_detach(device_t dev) -{ - struct aic_isa_softc *sc = device_get_softc(dev); - struct aic_softc *aic = &sc->sc_aic; - int error; - - error = aic_detach(aic); - if (error) { - device_printf(dev, "detach failed\n"); - return (error); - } - - error = bus_teardown_intr(dev, sc->sc_irq, sc->sc_ih); - if (error) { - device_printf(dev, "failed to unregister interrupt handler\n"); - } - - aic_isa_release_resources(dev); - return (0); -} - -static device_method_t aic_isa_methods[] = { - /* Device interface */ - DEVMETHOD(device_probe, aic_isa_probe), - DEVMETHOD(device_attach, aic_isa_attach), - DEVMETHOD(device_detach, aic_isa_detach), - { 0, 0 } -}; - -static driver_t aic_isa_driver = { - "aic", - aic_isa_methods, sizeof(struct aic_isa_softc), -}; - -extern devclass_t aic_devclass; - -MODULE_DEPEND(aic, cam, 1,1,1); -DRIVER_MODULE(aic, isa, aic_isa_driver, aic_devclass, 0, 0); diff --git a/sys/dev/altera/avgen/altera_avgen.c b/sys/dev/altera/avgen/altera_avgen.c index f880e8608dcd..abe007163a16 100644 --- a/sys/dev/altera/avgen/altera_avgen.c +++ b/sys/dev/altera/avgen/altera_avgen.c @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2012-2013 Robert N. M. Watson + * Copyright (c) 2012-2013, 2016 Robert N. M. Watson * All rights reserved. * * This software was developed by SRI International and the University of @@ -32,6 +32,7 @@ __FBSDID("$FreeBSD$"); #include <sys/param.h> +#include <sys/bio.h> #include <sys/bus.h> #include <sys/condvar.h> #include <sys/conf.h> @@ -45,6 +46,8 @@ __FBSDID("$FreeBSD$"); #include <sys/systm.h> #include <sys/uio.h> +#include <geom/geom_disk.h> + #include <machine/bus.h> #include <machine/resource.h> @@ -65,14 +68,19 @@ static d_mmap_t altera_avgen_mmap; static d_read_t altera_avgen_read; static d_write_t altera_avgen_write; +#define ALTERA_AVGEN_DEVNAME "altera_avgen" +#define ALTERA_AVGEN_DEVNAME_FMT (ALTERA_AVGEN_DEVNAME "%d") + static struct cdevsw avg_cdevsw = { .d_version = D_VERSION, .d_mmap = altera_avgen_mmap, .d_read = altera_avgen_read, .d_write = altera_avgen_write, - .d_name = "altera_avgen", + .d_name = ALTERA_AVGEN_DEVNAME, }; +#define ALTERA_AVGEN_SECTORSIZE 512 /* Not configurable at this time. */ + static int altera_avgen_read(struct cdev *dev, struct uio *uio, int flag) { @@ -227,11 +235,103 @@ altera_avgen_mmap(struct cdev *dev, vm_ooffset_t offset, vm_paddr_t *paddr, return (0); } +/* + * NB: We serialise block reads and writes in case the OS is generating + * concurrent I/O against the same block, in which case we want one I/O (or + * another) to win. This is not sufficient to provide atomicity for the + * sector in the presence of a fail stop -- however, we're just writing this + * to non-persistent DRAM .. right? + */ +static void +altera_avgen_disk_strategy(struct bio *bp) +{ + struct altera_avgen_softc *sc; + void *data; + long bcount; + daddr_t pblkno; + + sc = bp->bio_disk->d_drv1; + data = bp->bio_data; + bcount = bp->bio_bcount; + pblkno = bp->bio_pblkno; + + /* + * Serialize block reads / writes. + */ + mtx_lock(&sc->avg_disk_mtx); + switch (bp->bio_cmd) { + case BIO_READ: + if (!(sc->avg_flags & ALTERA_AVALON_FLAG_GEOM_READ)) { + biofinish(bp, NULL, EIO); + break; + } + switch (sc->avg_width) { + case 1: + bus_read_region_1(sc->avg_res, + bp->bio_pblkno * ALTERA_AVGEN_SECTORSIZE, + (uint8_t *)data, bcount); + break; + + case 2: + bus_read_region_2(sc->avg_res, + bp->bio_pblkno * ALTERA_AVGEN_SECTORSIZE, + (uint16_t *)data, bcount / 2); + break; + + case 4: + bus_read_region_4(sc->avg_res, + bp->bio_pblkno * ALTERA_AVGEN_SECTORSIZE, + (uint32_t *)data, bcount / 4); + break; + + default: + panic("%s: unexpected width %u", __func__, + sc->avg_width); + } + break; + + case BIO_WRITE: + if (!(sc->avg_flags & ALTERA_AVALON_FLAG_GEOM_WRITE)) { + biofinish(bp, NULL, EROFS); + break; + } + switch (sc->avg_width) { + case 1: + bus_write_region_1(sc->avg_res, + bp->bio_pblkno * ALTERA_AVGEN_SECTORSIZE, + (uint8_t *)data, bcount); + break; + + case 2: + bus_write_region_2(sc->avg_res, + bp->bio_pblkno * ALTERA_AVGEN_SECTORSIZE, + (uint16_t *)data, bcount / 2); + break; + + case 4: + bus_write_region_4(sc->avg_res, + bp->bio_pblkno * ALTERA_AVGEN_SECTORSIZE, + (uint32_t *)data, bcount / 4); + break; + + default: + panic("%s: unexpected width %u", __func__, + sc->avg_width); + } + break; + + default: + panic("%s: unsupported I/O operation %d", __func__, + bp->bio_cmd); + } + mtx_unlock(&sc->avg_disk_mtx); + biofinish(bp, NULL, 0); +} static int altera_avgen_process_options(struct altera_avgen_softc *sc, - const char *str_fileio, const char *str_mmapio, const char *str_devname, - int devunit) + const char *str_fileio, const char *str_geomio, const char *str_mmapio, + const char *str_devname, int devunit) { const char *cp; device_t dev = sc->avg_dev; @@ -239,12 +339,30 @@ altera_avgen_process_options(struct altera_avgen_softc *sc, /* * Check for valid combinations of options. */ - if (str_fileio == NULL && str_mmapio == NULL) { + if (str_fileio == NULL && str_geomio == NULL && str_mmapio == NULL) { + device_printf(dev, + "at least one of %s, %s, or %s must be specified\n", + ALTERA_AVALON_STR_FILEIO, ALTERA_AVALON_STR_GEOMIO, + ALTERA_AVALON_STR_MMAPIO); + return (ENXIO); + } + + /* + * Validity check: a device can either be a GEOM device (in which case + * we use GEOM to register the device node), or a special device -- + * but not both as that causes a collision in /dev. + */ + if (str_geomio != NULL && (str_fileio != NULL || str_mmapio != NULL)) { device_printf(dev, - "at least one of %s or %s must be specified\n", - ALTERA_AVALON_STR_FILEIO, ALTERA_AVALON_STR_MMAPIO); + "at most one of %s and (%s or %s) may be specified\n", + ALTERA_AVALON_STR_GEOMIO, ALTERA_AVALON_STR_FILEIO, + ALTERA_AVALON_STR_MMAPIO); return (ENXIO); } + + /* + * Ensure that a unit is specified if a name is also specified. + */ if (str_devname == NULL && devunit != -1) { device_printf(dev, "%s requires %s be specified\n", ALTERA_AVALON_STR_DEVUNIT, ALTERA_AVALON_STR_DEVNAME); @@ -288,6 +406,25 @@ altera_avgen_process_options(struct altera_avgen_softc *sc, } } } + if (str_geomio != NULL) { + for (cp = str_geomio; *cp != '\0'; cp++){ + switch (*cp) { + case ALTERA_AVALON_CHAR_READ: + sc->avg_flags |= ALTERA_AVALON_FLAG_GEOM_READ; + break; + + case ALTERA_AVALON_CHAR_WRITE: + sc->avg_flags |= ALTERA_AVALON_FLAG_GEOM_WRITE; + break; + + default: + device_printf(dev, + "invalid %s character %c\n", + ALTERA_AVALON_STR_GEOMIO, *cp); + return (ENXIO); + } + } + } if (str_mmapio != NULL) { for (cp = str_mmapio; *cp != '\0'; cp++) { switch (*cp) { @@ -317,13 +454,14 @@ altera_avgen_process_options(struct altera_avgen_softc *sc, int altera_avgen_attach(struct altera_avgen_softc *sc, const char *str_fileio, - const char *str_mmapio, const char *str_devname, int devunit) + const char *str_geomio, const char *str_mmapio, const char *str_devname, + int devunit) { device_t dev = sc->avg_dev; int error; - error = altera_avgen_process_options(sc, str_fileio, str_mmapio, - str_devname, devunit); + error = altera_avgen_process_options(sc, str_fileio, str_geomio, + str_mmapio, str_devname, devunit); if (error) return (error); @@ -339,23 +477,59 @@ altera_avgen_attach(struct altera_avgen_softc *sc, const char *str_fileio, } } - /* Device node allocation. */ - if (str_devname == NULL) { - str_devname = "altera_avgen%d"; + /* + * If a GEOM permission is requested, then create the device via GEOM. + * Otherwise, create a special device. We checked during options + * processing that both weren't requested a once. + */ + if (str_devname != NULL) { + sc->avg_name = strdup(str_devname, M_TEMP); devunit = sc->avg_unit; + } else + sc->avg_name = strdup(ALTERA_AVGEN_DEVNAME, M_TEMP); + if (sc->avg_flags & (ALTERA_AVALON_FLAG_GEOM_READ | + ALTERA_AVALON_FLAG_GEOM_WRITE)) { + mtx_init(&sc->avg_disk_mtx, "altera_avgen_disk", NULL, + MTX_DEF); + sc->avg_disk = disk_alloc(); + sc->avg_disk->d_drv1 = sc; + sc->avg_disk->d_strategy = altera_avgen_disk_strategy; + if (devunit == -1) + devunit = 0; + sc->avg_disk->d_name = sc->avg_name; + sc->avg_disk->d_unit = devunit; + + /* + * NB: As avg_res is a multiple of PAGE_SIZE, it is also a + * multiple of ALTERA_AVGEN_SECTORSIZE. + */ + sc->avg_disk->d_sectorsize = ALTERA_AVGEN_SECTORSIZE; + sc->avg_disk->d_mediasize = rman_get_size(sc->avg_res); + sc->avg_disk->d_maxsize = ALTERA_AVGEN_SECTORSIZE; + disk_create(sc->avg_disk, DISK_VERSION); + } else { + /* Device node allocation. */ + if (str_devname == NULL) { + str_devname = ALTERA_AVGEN_DEVNAME_FMT; + devunit = sc->avg_unit; + } + if (devunit != -1) + sc->avg_cdev = make_dev(&avg_cdevsw, sc->avg_unit, + UID_ROOT, GID_WHEEL, S_IRUSR | S_IWUSR, "%s%d", + str_devname, devunit); + else + sc->avg_cdev = make_dev(&avg_cdevsw, sc->avg_unit, + UID_ROOT, GID_WHEEL, S_IRUSR | S_IWUSR, + "%s", str_devname); + if (sc->avg_cdev == NULL) { + device_printf(sc->avg_dev, "%s: make_dev failed\n", + __func__); + return (ENXIO); + } + + /* XXXRW: Slight race between make_dev(9) and here. */ + sc->avg_cdev->si_drv1 = sc; } - if (devunit != -1) - sc->avg_cdev = make_dev(&avg_cdevsw, sc->avg_unit, UID_ROOT, - GID_WHEEL, S_IRUSR | S_IWUSR, str_devname, devunit); - else - sc->avg_cdev = make_dev(&avg_cdevsw, sc->avg_unit, UID_ROOT, - GID_WHEEL, S_IRUSR | S_IWUSR, str_devname); - if (sc->avg_cdev == NULL) { - device_printf(sc->avg_dev, "%s: make_dev failed\n", __func__); - return (ENXIO); - } - /* XXXRW: Slight race between make_dev(9) and here. */ - sc->avg_cdev->si_drv1 = sc; return (0); } @@ -363,5 +537,15 @@ void altera_avgen_detach(struct altera_avgen_softc *sc) { - destroy_dev(sc->avg_cdev); + KASSERT((sc->avg_disk != NULL) || (sc->avg_cdev != NULL), + ("%s: neither GEOM nor special device", __func__)); + + if (sc->avg_disk != NULL) { + disk_gone(sc->avg_disk); + disk_destroy(sc->avg_disk); + free(sc->avg_name, M_TEMP); + mtx_destroy(&sc->avg_disk_mtx); + } else { + destroy_dev(sc->avg_cdev); + } } diff --git a/sys/dev/altera/avgen/altera_avgen.h b/sys/dev/altera/avgen/altera_avgen.h index fb25a3cc276b..9c276015de25 100644 --- a/sys/dev/altera/avgen/altera_avgen.h +++ b/sys/dev/altera/avgen/altera_avgen.h @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2012 Robert N. M. Watson + * Copyright (c) 2012, 2016 Robert N. M. Watson * All rights reserved. * * This software was developed by SRI International and the University of @@ -39,6 +39,7 @@ struct altera_avgen_softc { */ device_t avg_dev; int avg_unit; + char *avg_name; /* * The device node and memory-mapped I/O region. @@ -52,6 +53,13 @@ struct altera_avgen_softc { */ u_int avg_flags; u_int avg_width; + u_int avg_sectorsize; + + /* + * disk(9) state, if required for this device. + */ + struct disk *avg_disk; + struct mtx avg_disk_mtx; }; /* @@ -63,6 +71,8 @@ struct altera_avgen_softc { #define ALTERA_AVALON_FLAG_MMAP_READ 0x04 #define ALTERA_AVALON_FLAG_MMAP_WRITE 0x08 #define ALTERA_AVALON_FLAG_MMAP_EXEC 0x10 +#define ALTERA_AVALON_FLAG_GEOM_READ 0x20 +#define ALTERA_AVALON_FLAG_GEOM_WRITE 0x40 #define ALTERA_AVALON_CHAR_READ 'r' #define ALTERA_AVALON_CHAR_WRITE 'w' @@ -70,6 +80,7 @@ struct altera_avgen_softc { #define ALTERA_AVALON_STR_WIDTH "width" #define ALTERA_AVALON_STR_FILEIO "fileio" +#define ALTERA_AVALON_STR_GEOMIO "geomio" #define ALTERA_AVALON_STR_MMAPIO "mmapio" #define ALTERA_AVALON_STR_DEVNAME "devname" #define ALTERA_AVALON_STR_DEVUNIT "devunit" @@ -78,8 +89,8 @@ struct altera_avgen_softc { * Driver setup routines from the bus attachment/teardown. */ int altera_avgen_attach(struct altera_avgen_softc *sc, - const char *str_fileio, const char *str_mmapio, - const char *str_devname, int devunit); + const char *str_fileio, const char *str_geomio, + const char *str_mmapio, const char *str_devname, int devunit); void altera_avgen_detach(struct altera_avgen_softc *sc); extern devclass_t altera_avgen_devclass; diff --git a/sys/dev/altera/avgen/altera_avgen_fdt.c b/sys/dev/altera/avgen/altera_avgen_fdt.c index 79e07eae1e53..548d3b14016c 100644 --- a/sys/dev/altera/avgen/altera_avgen_fdt.c +++ b/sys/dev/altera/avgen/altera_avgen_fdt.c @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2012-2013 Robert N. M. Watson + * Copyright (c) 2012-2013, 2016 Robert N. M. Watson * All rights reserved. * * This software was developed by SRI International and the University of @@ -75,7 +75,7 @@ static int altera_avgen_fdt_attach(device_t dev) { struct altera_avgen_softc *sc; - char *str_fileio, *str_mmapio; + char *str_fileio, *str_geomio, *str_mmapio; char *str_devname; phandle_t node; pcell_t cell; @@ -90,6 +90,7 @@ altera_avgen_fdt_attach(device_t dev) * expose the device via /dev. */ str_fileio = NULL; + str_geomio = NULL; str_mmapio = NULL; str_devname = NULL; devunit = -1; @@ -99,6 +100,8 @@ altera_avgen_fdt_attach(device_t dev) sc->avg_width = cell; (void)OF_getprop_alloc(node, "sri-cambridge,fileio", sizeof(char), (void **)&str_fileio); + (void)OF_getprop_alloc(node, "sri-cambridge,geomio", sizeof(char), + (void **)&str_geomio); (void)OF_getprop_alloc(node, "sri-cambridge,mmapio", sizeof(char), (void **)&str_mmapio); (void)OF_getprop_alloc(node, "sri-cambridge,devname", sizeof(char), @@ -114,13 +117,15 @@ altera_avgen_fdt_attach(device_t dev) device_printf(dev, "couldn't map memory\n"); return (ENXIO); } - error = altera_avgen_attach(sc, str_fileio, str_mmapio, str_devname, - devunit); + error = altera_avgen_attach(sc, str_fileio, str_geomio, str_mmapio, + str_devname, devunit); if (error != 0) bus_release_resource(dev, SYS_RES_MEMORY, sc->avg_rid, sc->avg_res); if (str_fileio != NULL) OF_prop_free(str_fileio); + if (str_geomio != NULL) + OF_prop_free(str_geomio); if (str_mmapio != NULL) OF_prop_free(str_mmapio); if (str_devname != NULL) diff --git a/sys/dev/altera/avgen/altera_avgen_nexus.c b/sys/dev/altera/avgen/altera_avgen_nexus.c index c3daab736623..2438da66c64f 100644 --- a/sys/dev/altera/avgen/altera_avgen_nexus.c +++ b/sys/dev/altera/avgen/altera_avgen_nexus.c @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2012-2013 Robert N. M. Watson + * Copyright (c) 2012-2013, 2016 Robert N. M. Watson * All rights reserved. * * This software was developed by SRI International and the University of @@ -64,7 +64,7 @@ static int altera_avgen_nexus_attach(device_t dev) { struct altera_avgen_softc *sc; - const char *str_fileio, *str_mmapio; + const char *str_fileio, *str_geomio, *str_mmapio; const char *str_devname; int devunit, error; @@ -77,6 +77,7 @@ altera_avgen_nexus_attach(device_t dev) * on the device, and whether it is cached. */ str_fileio = NULL; + str_geomio = NULL; str_mmapio = NULL; str_devname = NULL; devunit = -1; @@ -90,6 +91,8 @@ altera_avgen_nexus_attach(device_t dev) (void)resource_string_value(device_get_name(dev), device_get_unit(dev), ALTERA_AVALON_STR_FILEIO, &str_fileio); (void)resource_string_value(device_get_name(dev), + device_get_unit(dev), ALTERA_AVALON_STR_GEOMIO, &str_geomio); + (void)resource_string_value(device_get_name(dev), device_get_unit(dev), ALTERA_AVALON_STR_MMAPIO, &str_mmapio); (void)resource_string_value(device_get_name(dev), device_get_unit(dev), ALTERA_AVALON_STR_DEVNAME, &str_devname); @@ -104,8 +107,8 @@ altera_avgen_nexus_attach(device_t dev) device_printf(dev, "couldn't map memory\n"); return (ENXIO); } - error = altera_avgen_attach(sc, str_fileio, str_mmapio, str_devname, - devunit); + error = altera_avgen_attach(sc, str_fileio, str_geomio, str_mmapio, + str_devname, devunit); if (error != 0) bus_release_resource(dev, SYS_RES_MEMORY, sc->avg_rid, sc->avg_res); diff --git a/sys/dev/altera/jtag_uart/altera_jtag_uart_cons.c b/sys/dev/altera/jtag_uart/altera_jtag_uart_cons.c index 96d20ceb21f4..07e884dde63a 100644 --- a/sys/dev/altera/jtag_uart/altera_jtag_uart_cons.c +++ b/sys/dev/altera/jtag_uart/altera_jtag_uart_cons.c @@ -40,6 +40,7 @@ __FBSDID("$FreeBSD$"); #include <sys/lock.h> #include <sys/mutex.h> #include <sys/reboot.h> +#include <sys/sysctl.h> #include <sys/systm.h> #include <sys/tty.h> @@ -49,6 +50,9 @@ __FBSDID("$FreeBSD$"); devclass_t altera_jtag_uart_devclass; +static SYSCTL_NODE(_hw, OID_AUTO, altera_jtag_uart, CTLFLAG_RW, 0, + "Altera JTAG UART configuration knobs"); + /* * One-byte buffer as we can't check whether the UART is readable without * actually reading from it, synchronised by a spinlock; this lock also @@ -82,6 +86,11 @@ static cn_ungrab_t aju_cnungrab; * no AC bit set. */ #define ALTERA_JTAG_UART_AC_POLL_DELAY 10000 +static u_int altera_jtag_uart_ac_poll_delay = + ALTERA_JTAG_UART_AC_POLL_DELAY; +SYSCTL_UINT(_hw_altera_jtag_uart, OID_AUTO, ac_poll_delay, + CTLFLAG_RW, &altera_jtag_uart_ac_poll_delay, 0, + "Maximum delay waiting for JTAG present flag when buffer is full"); /* * I/O routines lifted from Deimos. This is not only MIPS-specific, but also @@ -220,10 +229,10 @@ aju_cons_write(char ch) * layer clearing of the bit doesn't trigger a TTY-layer * disconnection. * - * XXXRW: The polling delay may require tuning. - * * XXXRW: Notice the inherent race with hardware: in clearing the - * bit, we may race with hardware setting the same bit. + * bit, we may race with hardware setting the same bit. This can + * cause real-world reliability problems due to lost output on the + * console. */ v = aju_cons_control_read(); if (v & ALTERA_JTAG_UART_CONTROL_AC) { @@ -235,7 +244,7 @@ aju_cons_write(char ch) while ((v & ALTERA_JTAG_UART_CONTROL_WSPACE) == 0) { if (!aju_cons_jtag_present) return; - DELAY(ALTERA_JTAG_UART_AC_POLL_DELAY); + DELAY(altera_jtag_uart_ac_poll_delay); v = aju_cons_control_read(); if (v & ALTERA_JTAG_UART_CONTROL_AC) { aju_cons_jtag_present = 1; diff --git a/sys/dev/altera/jtag_uart/altera_jtag_uart_tty.c b/sys/dev/altera/jtag_uart/altera_jtag_uart_tty.c index 1e9a1b89657d..9f16dba6d99e 100644 --- a/sys/dev/altera/jtag_uart/altera_jtag_uart_tty.c +++ b/sys/dev/altera/jtag_uart/altera_jtag_uart_tty.c @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2011-2012 Robert N. M. Watson + * Copyright (c) 2011-2012, 2016 Robert N. M. Watson * All rights reserved. * * This software was developed by SRI International and the University of @@ -40,10 +40,12 @@ __FBSDID("$FreeBSD$"); #include <sys/systm.h> #include <sys/kernel.h> #include <sys/reboot.h> +#include <sys/sysctl.h> #include <sys/tty.h> #include <ddb/ddb.h> +#include <machine/atomic.h> #include <machine/bus.h> #include <dev/altera/jtag_uart/altera_jtag_uart.h> @@ -65,9 +67,9 @@ static struct ttydevsw aju_ttydevsw = { /* * When polling for the AC bit, the number of times we have to not see it - * before assuming JTAG has disappeared on us. By default, two seconds. + * before assuming JTAG has disappeared on us. By default, four seconds. */ -#define AJU_JTAG_MAXMISS 10 +#define AJU_JTAG_MAXMISS 20 /* * Polling intervals for input/output and JTAG connection events. @@ -76,6 +78,53 @@ static struct ttydevsw aju_ttydevsw = { #define AJU_AC_POLLINTERVAL (hz/5) /* + * Statistics on JTAG removal events when sending, for debugging purposes + * only. + */ +static u_int aju_jtag_vanished; +SYSCTL_UINT(_debug, OID_AUTO, aju_jtag_vanished, CTLFLAG_RW, + &aju_jtag_vanished, 0, "Number of times JTAG has vanished"); + +static u_int aju_jtag_appeared; +SYSCTL_UINT(_debug, OID_AUTO, aju_jtag_appeared, CTLFLAG_RW, + &aju_jtag_appeared, 0, "Number of times JTAG has appeared"); + +SYSCTL_INT(_debug, OID_AUTO, aju_cons_jtag_present, CTLFLAG_RW, + &aju_cons_jtag_present, 0, "JTAG console present flag"); + +SYSCTL_UINT(_debug, OID_AUTO, aju_cons_jtag_missed, CTLFLAG_RW, + &aju_cons_jtag_missed, 0, "JTAG console missed counter"); + +/* + * Interrupt-related statistics. + */ +static u_int aju_intr_readable_enabled; +SYSCTL_UINT(_debug, OID_AUTO, aju_intr_readable_enabled, CTLFLAG_RW, + &aju_intr_readable_enabled, 0, "Number of times read interrupt enabled"); + +static u_int aju_intr_writable_disabled; +SYSCTL_UINT(_debug, OID_AUTO, aju_intr_writable_disabled, CTLFLAG_RW, + &aju_intr_writable_disabled, 0, + "Number of times write interrupt disabled"); + +static u_int aju_intr_writable_enabled; +SYSCTL_UINT(_debug, OID_AUTO, aju_intr_writable_enabled, CTLFLAG_RW, + &aju_intr_writable_enabled, 0, + "Number of times write interrupt enabled"); + +static u_int aju_intr_disabled; +SYSCTL_UINT(_debug, OID_AUTO, aju_intr_disabled, CTLFLAG_RW, + &aju_intr_disabled, 0, "Number of times write interrupt disabled"); + +static u_int aju_intr_read_count; +SYSCTL_UINT(_debug, OID_AUTO, aju_intr_read_count, CTLFLAG_RW, + &aju_intr_read_count, 0, "Number of times read interrupt fired"); + +static u_int aju_intr_write_count; +SYSCTL_UINT(_debug, OID_AUTO, aju_intr_write_count, CTLFLAG_RW, + &aju_intr_write_count, 0, "Number of times write interrupt fired"); + +/* * Low-level read and write register routines; the Altera UART is little * endian, so we byte swap 32-bit reads and writes. */ @@ -160,6 +209,7 @@ aju_intr_readable_enable(struct altera_jtag_uart_softc *sc) AJU_LOCK_ASSERT(sc); + atomic_add_int(&aju_intr_readable_enabled, 1); v = aju_control_read(sc); v |= ALTERA_JTAG_UART_CONTROL_RE; aju_control_write(sc, v); @@ -172,6 +222,7 @@ aju_intr_writable_enable(struct altera_jtag_uart_softc *sc) AJU_LOCK_ASSERT(sc); + atomic_add_int(&aju_intr_writable_enabled, 1); v = aju_control_read(sc); v |= ALTERA_JTAG_UART_CONTROL_WE; aju_control_write(sc, v); @@ -184,6 +235,7 @@ aju_intr_writable_disable(struct altera_jtag_uart_softc *sc) AJU_LOCK_ASSERT(sc); + atomic_add_int(&aju_intr_writable_disabled, 1); v = aju_control_read(sc); v &= ~ALTERA_JTAG_UART_CONTROL_WE; aju_control_write(sc, v); @@ -196,6 +248,7 @@ aju_intr_disable(struct altera_jtag_uart_softc *sc) AJU_LOCK_ASSERT(sc); + atomic_add_int(&aju_intr_disabled, 1); v = aju_control_read(sc); v &= ~(ALTERA_JTAG_UART_CONTROL_RE | ALTERA_JTAG_UART_CONTROL_WE); aju_control_write(sc, v); @@ -249,30 +302,7 @@ aju_handle_output(struct altera_jtag_uart_softc *sc, struct tty *tp) AJU_UNLOCK(sc); while (ttydisc_getc_poll(tp) != 0) { AJU_LOCK(sc); - v = aju_control_read(sc); - if ((v & ALTERA_JTAG_UART_CONTROL_WSPACE) != 0) { - AJU_UNLOCK(sc); - if (ttydisc_getc(tp, &ch, sizeof(ch)) != sizeof(ch)) - panic("%s: ttydisc_getc", __func__); - AJU_LOCK(sc); - - /* - * XXXRW: There is a slight race here in which we test - * for writability, drop the lock, get the character - * from the tty layer, re-acquire the lock, and then - * write. It's possible for other code -- - * specifically, the low-level console -- to have - * written in the mean time, which might mean that - * there is no longer space. The BERI memory bus will - * cause this write to block, wedging the processor - * until space is available -- which could be a while - * if JTAG is not attached! - * - * The 'easy' fix is to drop the character if WSPACE - * has become unset. Not sure what the 'hard' fix is. - */ - aju_data_write(sc, ch); - } else { + if (*sc->ajus_jtag_presentp == 0) { /* * If JTAG is not present, then we will drop this * character instead of perhaps scheduling an @@ -281,21 +311,50 @@ aju_handle_output(struct altera_jtag_uart_softc *sc, struct tty *tp) * later even though we aren't interested in sending * anymore. Loop to drain TTY-layer buffer. */ - if (*sc->ajus_jtag_presentp == 0) { - if (ttydisc_getc(tp, &ch, sizeof(ch)) != - sizeof(ch)) - panic("%s: ttydisc_getc 2", __func__); - AJU_UNLOCK(sc); - continue; - } - if (sc->ajus_irq_res != NULL) + AJU_UNLOCK(sc); + if (ttydisc_getc(tp, &ch, sizeof(ch)) != + sizeof(ch)) + panic("%s: ttydisc_getc", __func__); + continue; + } + v = aju_control_read(sc); + if ((v & ALTERA_JTAG_UART_CONTROL_WSPACE) == 0) { + if (sc->ajus_irq_res != NULL && + (v & ALTERA_JTAG_UART_CONTROL_WE) == 0) aju_intr_writable_enable(sc); return; } AJU_UNLOCK(sc); + if (ttydisc_getc(tp, &ch, sizeof(ch)) != sizeof(ch)) + panic("%s: ttydisc_getc 2", __func__); + AJU_LOCK(sc); + + /* + * XXXRW: There is a slight race here in which we test for + * writability, drop the lock, get the character from the tty + * layer, re-acquire the lock, and then write. It's possible + * for other code -- specifically, the low-level console -- to + * have* written in the mean time, which might mean that there + * is no longer space. The BERI memory bus will cause this + * write to block, wedging the processor until space is + * available -- which could be a while if JTAG is not + * attached! + * + * The 'easy' fix is to drop the character if WSPACE has + * become unset. Not sure what the 'hard' fix is. + */ + aju_data_write(sc, ch); + AJU_UNLOCK(sc); } AJU_LOCK(sc); - aju_intr_writable_disable(sc); + + /* + * If interrupts are configured, and there's no data to write, but we + * had previously enabled write interrupts, disable them now. + */ + v = aju_control_read(sc); + if (sc->ajus_irq_res != NULL && (v & ALTERA_JTAG_UART_CONTROL_WE) != 0) + aju_intr_writable_disable(sc); } static void @@ -355,16 +414,25 @@ aju_ac_callout(void *arg) v &= ~ALTERA_JTAG_UART_CONTROL_AC; aju_control_write(sc, v); if (*sc->ajus_jtag_presentp == 0) { - *sc->ajus_jtag_missedp = 0; *sc->ajus_jtag_presentp = 1; + atomic_add_int(&aju_jtag_appeared, 1); aju_handle_output(sc, tp); } + + /* Any hit eliminates all recent misses. */ + *sc->ajus_jtag_missedp = 0; } else if (*sc->ajus_jtag_presentp != 0) { - (*sc->ajus_jtag_missedp)++; - if (*sc->ajus_jtag_missedp >= AJU_JTAG_MAXMISS) { + /* + * If we've exceeded our tolerance for misses, mark JTAG as + * disconnected and drain output. Otherwise, bump the miss + * counter. + */ + if (*sc->ajus_jtag_missedp > AJU_JTAG_MAXMISS) { *sc->ajus_jtag_presentp = 0; + atomic_add_int(&aju_jtag_vanished, 1); aju_handle_output(sc, tp); - } + } else + (*sc->ajus_jtag_missedp)++; } callout_reset(&sc->ajus_ac_callout, AJU_AC_POLLINTERVAL, aju_ac_callout, sc); @@ -382,10 +450,14 @@ aju_intr(void *arg) tty_lock(tp); AJU_LOCK(sc); v = aju_control_read(sc); - if (v & ALTERA_JTAG_UART_CONTROL_RI) + if (v & ALTERA_JTAG_UART_CONTROL_RI) { + atomic_add_int(&aju_intr_read_count, 1); aju_handle_input(sc, tp); - if (v & ALTERA_JTAG_UART_CONTROL_WI) + } + if (v & ALTERA_JTAG_UART_CONTROL_WI) { + atomic_add_int(&aju_intr_write_count, 1); aju_handle_output(sc, tp); + } AJU_UNLOCK(sc); tty_unlock(tp); } diff --git a/sys/dev/ata/ata-all.h b/sys/dev/ata/ata-all.h index cf8ed784e7b8..8ef4191eca8c 100644 --- a/sys/dev/ata/ata-all.h +++ b/sys/dev/ata/ata-all.h @@ -83,7 +83,6 @@ #define ATA_CTLOFFSET 0x206 /* control register offset */ #define ATA_PCCARD_CTLOFFSET 0x0e /* do for PCCARD devices */ -#define ATA_PC98_CTLOFFSET 0x10c /* do for PC98 devices */ #define ATA_A_IDS 0x02 /* disable interrupts */ #define ATA_A_RESET 0x04 /* RESET controller */ #ifdef ATA_LEGACY_SUPPORT @@ -178,17 +177,12 @@ /* misc defines */ #define ATA_PRIMARY 0x1f0 #define ATA_SECONDARY 0x170 -#define ATA_PC98_BANK 0x432 #define ATA_IOSIZE 0x08 -#define ATA_PC98_IOSIZE 0x10 #define ATA_CTLIOSIZE 0x01 #define ATA_BMIOSIZE 0x08 -#define ATA_PC98_BANKIOSIZE 0x01 #define ATA_IOADDR_RID 0 #define ATA_CTLADDR_RID 1 #define ATA_BMADDR_RID 0x20 -#define ATA_PC98_CTLADDR_RID 8 -#define ATA_PC98_BANKADDR_RID 9 #define ATA_IRQ_RID 0 #define ATA_DEV(unit) ((unit > 0) ? 0x10 : 0) #define ATA_CFA_MAGIC1 0x844A diff --git a/sys/dev/ata/ata-cbus.c b/sys/dev/ata/ata-cbus.c deleted file mode 100644 index 4165ea6a947a..000000000000 --- a/sys/dev/ata/ata-cbus.c +++ /dev/null @@ -1,349 +0,0 @@ -/*- - * Copyright (c) 2002 - 2008 Søren Schmidt <sos@FreeBSD.org> - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer, - * without modification, immediately at the beginning of the file. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#include <sys/param.h> -#include <sys/systm.h> -#include <sys/kernel.h> -#include <sys/ata.h> -#include <sys/bus.h> -#include <sys/malloc.h> -#include <sys/module.h> -#include <sys/conf.h> -#include <sys/sema.h> -#include <sys/taskqueue.h> -#include <vm/uma.h> -#include <machine/resource.h> -#include <machine/bus.h> -#include <sys/rman.h> -#include <isa/isavar.h> -#include <dev/ata/ata-all.h> -#include <ata_if.h> - -/* local vars */ -struct ata_cbus_controller { - struct resource *io; - struct resource *ctlio; - struct resource *bankio; - struct resource *irq; - void *ih; - int channels; - struct { - void (*function)(void *); - void *argument; - } interrupt[2]; -}; - -/* local prototypes */ -static void ata_cbus_intr(void *); - -static int -ata_cbus_probe(device_t dev) -{ - struct resource *io; - int rid; - rman_res_t tmp; - - /* dont probe PnP devices */ - if (isa_get_vendorid(dev)) - return (ENXIO); - - /* allocate the ioport range */ - rid = ATA_IOADDR_RID; - if (!(io = bus_alloc_resource_anywhere(dev, SYS_RES_IOPORT, &rid, - ATA_PC98_IOSIZE, RF_ACTIVE))) - return ENOMEM; - - /* calculate & set the altport range */ - rid = ATA_PC98_CTLADDR_RID; - if (bus_get_resource(dev, SYS_RES_IOPORT, rid, &tmp, &tmp)) { - bus_set_resource(dev, SYS_RES_IOPORT, rid, - rman_get_start(io)+ATA_PC98_CTLOFFSET, ATA_CTLIOSIZE); - } - - /* calculate & set the bank range */ - rid = ATA_PC98_BANKADDR_RID; - if (bus_get_resource(dev, SYS_RES_IOPORT, rid, &tmp, &tmp)) { - bus_set_resource(dev, SYS_RES_IOPORT, rid, - ATA_PC98_BANK, ATA_PC98_BANKIOSIZE); - } - - bus_release_resource(dev, SYS_RES_IOPORT, ATA_IOADDR_RID, io); - return 0; -} - -static int -ata_cbus_attach(device_t dev) -{ - struct ata_cbus_controller *ctlr = device_get_softc(dev); - device_t child; - int rid, unit; - - /* allocate resources */ - rid = ATA_IOADDR_RID; - if (!(ctlr->io = bus_alloc_resource_anywhere(dev, SYS_RES_IOPORT, &rid, - ATA_PC98_IOSIZE, RF_ACTIVE))) - return ENOMEM; - - rid = ATA_PC98_CTLADDR_RID; - if (!(ctlr->ctlio = - bus_alloc_resource(dev, SYS_RES_IOPORT, &rid, - rman_get_start(ctlr->io) + ATA_PC98_CTLOFFSET, ~0, - ATA_CTLIOSIZE, RF_ACTIVE))) { - bus_release_resource(dev, SYS_RES_IOPORT, ATA_IOADDR_RID, ctlr->io); - return ENOMEM; - } - - rid = ATA_PC98_BANKADDR_RID; - if (!(ctlr->bankio = bus_alloc_resource(dev, SYS_RES_IOPORT, &rid, - ATA_PC98_BANK, ~0, - ATA_PC98_BANKIOSIZE, RF_ACTIVE))) { - bus_release_resource(dev, SYS_RES_IOPORT, ATA_IOADDR_RID, ctlr->io); - bus_release_resource(dev, SYS_RES_IOPORT, ATA_CTLADDR_RID, ctlr->ctlio); - return ENOMEM; - } - - rid = ATA_IRQ_RID; - if (!(ctlr->irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid, - RF_ACTIVE | RF_SHAREABLE))) { - device_printf(dev, "unable to alloc interrupt\n"); - bus_release_resource(dev, SYS_RES_IOPORT, ATA_IOADDR_RID, ctlr->io); - bus_release_resource(dev, SYS_RES_IOPORT, ATA_CTLADDR_RID, ctlr->ctlio); - bus_release_resource(dev, SYS_RES_IOPORT, - ATA_PC98_BANKADDR_RID, ctlr->bankio); - return ENXIO; - } - - if ((bus_setup_intr(dev, ctlr->irq, ATA_INTR_FLAGS, - NULL, ata_cbus_intr, ctlr, &ctlr->ih))) { - device_printf(dev, "unable to setup interrupt\n"); - bus_release_resource(dev, SYS_RES_IOPORT, ATA_IOADDR_RID, ctlr->io); - bus_release_resource(dev, SYS_RES_IOPORT, ATA_CTLADDR_RID, ctlr->ctlio); - bus_release_resource(dev, SYS_RES_IOPORT, - ATA_PC98_BANKADDR_RID, ctlr->bankio); - bus_release_resource(dev, SYS_RES_IOPORT, ATA_IRQ_RID, ctlr->irq); - return ENXIO; - } - - /* Work around the lack of channel serialization in ATA_CAM. */ - ctlr->channels = 1; - device_printf(dev, "second channel ignored\n"); - - for (unit = 0; unit < ctlr->channels; unit++) { - child = device_add_child(dev, "ata", unit); - if (child == NULL) - device_printf(dev, "failed to add ata child device\n"); - else - device_set_ivars(child, (void *)(intptr_t)unit); - } - - bus_generic_attach(dev); - return (0); -} - -static struct resource * -ata_cbus_alloc_resource(device_t dev, device_t child, int type, int *rid, - rman_res_t start, rman_res_t end, rman_res_t count, - u_int flags) -{ - struct ata_cbus_controller *ctlr = device_get_softc(dev); - - if (type == SYS_RES_IOPORT) { - switch (*rid) { - case ATA_IOADDR_RID: - return ctlr->io; - case ATA_CTLADDR_RID: - return ctlr->ctlio; - } - } - if (type == SYS_RES_IRQ) - return ctlr->irq; - return 0; -} - -static int -ata_cbus_setup_intr(device_t dev, device_t child, struct resource *irq, - int flags, driver_filter_t *filter, driver_intr_t *intr, - void *arg, void **cookiep) -{ - struct ata_cbus_controller *controller = device_get_softc(dev); - int unit = ((struct ata_channel *)device_get_softc(child))->unit; - - if (filter != NULL) { - printf("ata-cbus.c: we cannot use a filter here\n"); - return (EINVAL); - } - controller->interrupt[unit].function = intr; - controller->interrupt[unit].argument = arg; - *cookiep = controller; - - return 0; -} - -static int -ata_cbus_print_child(device_t dev, device_t child) -{ - struct ata_channel *ch = device_get_softc(child); - int retval = 0; - - retval += bus_print_child_header(dev, child); - retval += printf(" at bank %d", ch->unit); - retval += bus_print_child_footer(dev, child); - return retval; -} - -static void -ata_cbus_intr(void *data) -{ - struct ata_cbus_controller *ctlr = data; - struct ata_channel *ch; - int unit; - - for (unit = 0; unit < ctlr->channels; unit++) { - if (!(ch = ctlr->interrupt[unit].argument)) - continue; - ctlr->interrupt[unit].function(ch); - } -} - -static device_method_t ata_cbus_methods[] = { - /* device interface */ - DEVMETHOD(device_probe, ata_cbus_probe), - DEVMETHOD(device_attach, ata_cbus_attach), -// DEVMETHOD(device_detach, ata_cbus_detach), - - /* bus methods */ - DEVMETHOD(bus_alloc_resource, ata_cbus_alloc_resource), - DEVMETHOD(bus_setup_intr, ata_cbus_setup_intr), - DEVMETHOD(bus_print_child, ata_cbus_print_child), - - DEVMETHOD_END -}; - -static driver_t ata_cbus_driver = { - "atacbus", - ata_cbus_methods, - sizeof(struct ata_cbus_controller), -}; - -static devclass_t ata_cbus_devclass; - -DRIVER_MODULE(atacbus, isa, ata_cbus_driver, ata_cbus_devclass, NULL, NULL); - -static int -ata_cbuschannel_probe(device_t dev) -{ - char buffer[32]; - - sprintf(buffer, "ATA channel %d", (int)(intptr_t)device_get_ivars(dev)); - device_set_desc_copy(dev, buffer); - - return ata_probe(dev); -} - -static int -ata_cbuschannel_attach(device_t dev) -{ - struct ata_cbus_controller *ctlr = device_get_softc(device_get_parent(dev)); - struct ata_channel *ch = device_get_softc(dev); - int i; - - if (ch->attached) - return (0); - ch->attached = 1; - - ch->unit = (intptr_t)device_get_ivars(dev); - /* setup the resource vectors */ - for (i = ATA_DATA; i <= ATA_COMMAND; i ++) { - ch->r_io[i].res = ctlr->io; - ch->r_io[i].offset = i << 1; - } - ch->r_io[ATA_CONTROL].res = ctlr->ctlio; - ch->r_io[ATA_CONTROL].offset = 0; - ch->r_io[ATA_IDX_ADDR].res = ctlr->io; - ata_default_registers(dev); - - /* initialize softc for this channel */ - ch->flags |= ATA_USE_16BIT; - ata_generic_hw(dev); - - return ata_attach(dev); -} - -static int -ata_cbuschannel_detach(device_t dev) -{ - struct ata_channel *ch = device_get_softc(dev); - - if (!ch->attached) - return (0); - ch->attached = 0; - - return ata_detach(dev); -} - -static int -ata_cbuschannel_suspend(device_t dev) -{ - struct ata_channel *ch = device_get_softc(dev); - - if (!ch->attached) - return (0); - - return ata_suspend(dev); -} - -static int -ata_cbuschannel_resume(device_t dev) -{ - struct ata_channel *ch = device_get_softc(dev); - - if (!ch->attached) - return (0); - - return ata_resume(dev); -} - -static device_method_t ata_cbuschannel_methods[] = { - /* device interface */ - DEVMETHOD(device_probe, ata_cbuschannel_probe), - DEVMETHOD(device_attach, ata_cbuschannel_attach), - DEVMETHOD(device_detach, ata_cbuschannel_detach), - DEVMETHOD(device_suspend, ata_cbuschannel_suspend), - DEVMETHOD(device_resume, ata_cbuschannel_resume), - DEVMETHOD_END -}; - -static driver_t ata_cbuschannel_driver = { - "ata", - ata_cbuschannel_methods, - sizeof(struct ata_channel), -}; - -DRIVER_MODULE(ata, atacbus, ata_cbuschannel_driver, ata_devclass, NULL, NULL); -MODULE_DEPEND(ata, ata, 1, 1, 1); diff --git a/sys/dev/ct/bshw_machdep.c b/sys/dev/ct/bshw_machdep.c deleted file mode 100644 index 046aa7d9430c..000000000000 --- a/sys/dev/ct/bshw_machdep.c +++ /dev/null @@ -1,743 +0,0 @@ -/* $NecBSD: bshw_machdep.c,v 1.8.12.6 2001/06/29 06:28:05 honda Exp $ */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); -/* $NetBSD$ */ - -/*- - * [NetBSD for NEC PC-98 series] - * Copyright (c) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 - * NetBSD/pc98 porting staff. All rights reserved. - * - * Copyright (c) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 - * Naofumi HONDA. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#include "opt_ddb.h" - -#include <sys/param.h> -#include <sys/systm.h> -#include <sys/kernel.h> -#include <sys/bio.h> -#include <sys/buf.h> -#include <sys/queue.h> -#include <sys/malloc.h> -#include <sys/errno.h> -#include <sys/rman.h> - -#include <vm/vm.h> - -#include <machine/bus.h> -#include <machine/md_var.h> - -#include <compat/netbsd/dvcfg.h> - -#include <cam/scsi/scsi_low.h> - -#include <dev/ic/wd33c93reg.h> -#include <dev/ct/ctvar.h> -#include <dev/ct/ct_machdep.h> -#include <dev/ct/bshwvar.h> - -#include <vm/pmap.h> - -#define BSHW_IO_CONTROL_FLAGS 0 - -u_int bshw_io_control = BSHW_IO_CONTROL_FLAGS; -int bshw_data_read_bytes = 4096; -int bshw_data_write_bytes = 4096; - -/********************************************************* - * OS dep part - *********************************************************/ -typedef unsigned long vaddr_t; - -/********************************************************* - * GENERIC MACHDEP FUNCTIONS - *********************************************************/ -void -bshw_synch_setup(struct ct_softc *ct, struct targ_info *ti) -{ - struct ct_bus_access_handle *chp = &ct->sc_ch; - struct ct_targ_info *cti = (void *) ti; - struct bshw_softc *bs = ct->ct_hw; - struct bshw *hw = bs->sc_hw; - - if (hw->hw_sregaddr == 0) - return; - - ct_cr_write_1(chp, hw->hw_sregaddr + ti->ti_id, cti->cti_syncreg); - if (hw->hw_flags & BSHW_DOUBLE_DMACHAN) - { - ct_cr_write_1(chp, hw->hw_sregaddr + ti->ti_id + 8, - cti->cti_syncreg); - } -} - -void -bshw_bus_reset(struct ct_softc *ct) -{ - struct scsi_low_softc *slp = &ct->sc_sclow; - struct ct_bus_access_handle *chp = &ct->sc_ch; - struct bshw_softc *bs = ct->ct_hw; - struct bshw *hw = bs->sc_hw; - bus_addr_t offs; - u_int8_t regv; - int i; - - /* open hardware busmaster mode */ - if (hw->hw_dma_init != NULL && ((*hw->hw_dma_init)(ct)) != 0) - { - device_printf(slp->sl_dev, - "change mode using external DMA (%x)\n", - (u_int)ct_cr_read_1(chp, 0x37)); - } - - /* clear hardware synch registers */ - offs = hw->hw_sregaddr; - if (offs != 0) - { - for (i = 0; i < 8; i ++, offs ++) - { - ct_cr_write_1(chp, offs, 0); - if ((hw->hw_flags & BSHW_DOUBLE_DMACHAN) != 0) - ct_cr_write_1(chp, offs + 8, 0); - } - } - - /* disable interrupt & assert reset */ - regv = ct_cr_read_1(chp, wd3s_mbank); - regv |= MBR_RST; - regv &= ~MBR_IEN; - ct_cr_write_1(chp, wd3s_mbank, regv); - - DELAY(500000); - - /* reset signal off */ - regv &= ~MBR_RST; - ct_cr_write_1(chp, wd3s_mbank, regv); - - /* interrupt enable */ - regv |= MBR_IEN; - ct_cr_write_1(chp, wd3s_mbank, regv); -} - -/* probe */ -int -bshw_read_settings(struct ct_bus_access_handle *chp, struct bshw_softc *bs) -{ - static int irq_tbl[] = { 3, 5, 6, 9, 12, 13 }; - - bs->sc_hostid = (ct_cr_read_1(chp, wd3s_auxc) & AUXCR_HIDM); - bs->sc_irq = irq_tbl[(ct_cr_read_1(chp, wd3s_auxc) >> 3) & 7]; - bs->sc_drq = ct_cmdp_read_1(chp) & 3; - return 0; -} - -/********************************************************* - * DMA PIO TRANSFER (SMIT) - *********************************************************/ -#define LC_SMIT_TIMEOUT 2 /* 2 sec: timeout for a fifo status ready */ -#define LC_SMIT_OFFSET 0x1000 -#define LC_FSZ DEV_BSIZE -#define LC_SFSZ 0x0c -#define LC_REST (LC_FSZ - LC_SFSZ) - -#define BSHW_LC_FSET 0x36 -#define BSHW_LC_FCTRL 0x44 -#define FCTRL_EN 0x01 -#define FCTRL_WRITE 0x02 - -#define SF_ABORT 0x08 -#define SF_RDY 0x10 - -static __inline void bshw_lc_smit_start(struct ct_softc *, int, u_int); -static __inline void bshw_lc_smit_stop(struct ct_softc *); -static int bshw_lc_smit_fstat(struct ct_softc *, int, int); - -static __inline void -bshw_lc_smit_stop(struct ct_softc *ct) -{ - struct ct_bus_access_handle *chp = &ct->sc_ch; - - ct_cr_write_1(chp, BSHW_LC_FCTRL, 0); - ct_cmdp_write_1(chp, CMDP_DMER); -} - -static __inline void -bshw_lc_smit_start(struct ct_softc *ct, int count, u_int direction) -{ - struct ct_bus_access_handle *chp = &ct->sc_ch; - u_int8_t pval, val; - - val = ct_cr_read_1(chp, BSHW_LC_FSET); - cthw_set_count(chp, count); - - pval = FCTRL_EN; - if (direction == SCSI_LOW_WRITE) - pval |= (val & 0xe0) | FCTRL_WRITE; - ct_cr_write_1(chp, BSHW_LC_FCTRL, pval); - ct_cr_write_1(chp, wd3s_cmd, WD3S_TFR_INFO); -} - -static int -bshw_lc_smit_fstat(struct ct_softc *ct, int wc, int read) -{ - struct ct_bus_access_handle *chp = &ct->sc_ch; - u_int8_t stat; - - while (wc -- > 0) - { - chp->ch_bus_weight(chp); - stat = ct_cmdp_read_1(chp); - if (read == SCSI_LOW_READ) - { - if ((stat & SF_RDY) != 0) - return 0; - if ((stat & SF_ABORT) != 0) - return EIO; - } - else - { - if ((stat & SF_ABORT) != 0) - return EIO; - if ((stat & SF_RDY) != 0) - return 0; - } - } - - device_printf(ct->sc_sclow.sl_dev, "SMIT fifo status timeout\n"); - return EIO; -} - -void -bshw_smit_xfer_stop(struct ct_softc *ct) -{ - struct scsi_low_softc *slp = &ct->sc_sclow; - struct bshw_softc *bs = ct->ct_hw; - struct targ_info *ti; - struct sc_p *sp = &slp->sl_scp; - u_int count; - - bshw_lc_smit_stop(ct); - - ti = slp->sl_Tnexus; - if (ti == NULL) - return; - - if (ti->ti_phase == PH_DATA) - { - count = cthw_get_count(&ct->sc_ch); - if (count < bs->sc_sdatalen) - { - if (sp->scp_direction == SCSI_LOW_READ && - count != bs->sc_edatalen) - goto bad; - - count = bs->sc_sdatalen - count; - if (count > (u_int) sp->scp_datalen) - goto bad; - - sp->scp_data += count; - sp->scp_datalen -= count; - } - else if (count > bs->sc_sdatalen) - { -bad: - device_printf(slp->sl_dev, - "smit_xfer_end: cnt error\n"); - slp->sl_error |= PDMAERR; - } - scsi_low_data_finish(slp); - } - else - { - device_printf(slp->sl_dev, "smit_xfer_end: phase miss\n"); - slp->sl_error |= PDMAERR; - } -} - -int -bshw_smit_xfer_start(struct ct_softc *ct) -{ - struct scsi_low_softc *slp = &ct->sc_sclow; - struct ct_bus_access_handle *chp = &ct->sc_ch; - struct bshw_softc *bs = ct->ct_hw; - struct sc_p *sp = &slp->sl_scp; - struct targ_info *ti = slp->sl_Tnexus; - struct ct_targ_info *cti = (void *) ti; - u_int datalen, count, io_control; - int wc; - u_int8_t *data; - - io_control = bs->sc_io_control | bshw_io_control; - if ((io_control & BSHW_SMIT_BLOCK) != 0) - return EINVAL; - - if ((slp->sl_scp.scp_datalen % DEV_BSIZE) != 0) - return EINVAL; - - datalen = sp->scp_datalen; - if (slp->sl_scp.scp_direction == SCSI_LOW_READ) - { - if ((io_control & BSHW_READ_INTERRUPT_DRIVEN) != 0 && - datalen > bshw_data_read_bytes) - datalen = bshw_data_read_bytes; - } - else - { - if ((io_control & BSHW_WRITE_INTERRUPT_DRIVEN) != 0 && - datalen > bshw_data_write_bytes) - datalen = bshw_data_write_bytes; - } - - bs->sc_sdatalen = datalen; - data = sp->scp_data; - wc = LC_SMIT_TIMEOUT * 1024 * 1024; - - ct_cr_write_1(chp, wd3s_ctrl, ct->sc_creg | CR_DMA); - bshw_lc_smit_start(ct, datalen, sp->scp_direction); - - if (sp->scp_direction == SCSI_LOW_READ) - { - do - { - if (bshw_lc_smit_fstat(ct, wc, SCSI_LOW_READ)) - break; - - count = (datalen > LC_FSZ ? LC_FSZ : datalen); - bus_read_region_4(chp->ch_mem, - LC_SMIT_OFFSET, (u_int32_t *) data, count >> 2); - data += count; - datalen -= count; - } - while (datalen > 0); - - bs->sc_edatalen = datalen; - } - else - { - do - { - if (bshw_lc_smit_fstat(ct, wc, SCSI_LOW_WRITE)) - break; - if (cti->cti_syncreg == 0) - { - /* XXX: - * If async transfer, reconfirm a scsi phase - * again. Unless C bus might hang up. - */ - if (bshw_lc_smit_fstat(ct, wc, SCSI_LOW_WRITE)) - break; - } - - count = (datalen > LC_SFSZ ? LC_SFSZ : datalen); - bus_write_region_4(chp->ch_mem, - LC_SMIT_OFFSET, (u_int32_t *) data, count >> 2); - data += count; - datalen -= count; - - if (bshw_lc_smit_fstat(ct, wc, SCSI_LOW_WRITE)) - break; - - count = (datalen > LC_REST ? LC_REST : datalen); - bus_write_region_4(chp->ch_mem, - LC_SMIT_OFFSET + LC_SFSZ, - (u_int32_t *) data, count >> 2); - data += count; - datalen -= count; - } - while (datalen > 0); - } - return 0; -} - -/********************************************************* - * DMA TRANSFER (BS) - *********************************************************/ -static __inline void bshw_dma_write_1 \ - (struct ct_bus_access_handle *, bus_addr_t, u_int8_t); -static void bshw_dmastart(struct ct_softc *); -static void bshw_dmadone(struct ct_softc *); - -int -bshw_dma_xfer_start(struct ct_softc *ct) -{ - struct scsi_low_softc *slp = &ct->sc_sclow; - struct sc_p *sp = &slp->sl_scp; - struct ct_bus_access_handle *chp = &ct->sc_ch; - struct bshw_softc *bs = ct->ct_hw; - vaddr_t va, endva, phys, nphys; - u_int io_control; - - io_control = bs->sc_io_control | bshw_io_control; - if ((io_control & BSHW_DMA_BLOCK) != 0 && sp->scp_datalen < 256) - return EINVAL; - - ct_cr_write_1(chp, wd3s_ctrl, ct->sc_creg | CR_DMA); - phys = vtophys((vaddr_t) sp->scp_data); - if (phys >= bs->sc_minphys) - { - /* setup segaddr */ - bs->sc_segaddr = bs->sc_bounce_phys; - /* setup seglen */ - bs->sc_seglen = sp->scp_datalen; - if (bs->sc_seglen > bs->sc_bounce_size) - bs->sc_seglen = bs->sc_bounce_size; - /* setup bufp */ - bs->sc_bufp = bs->sc_bounce_addr; - if (sp->scp_direction == SCSI_LOW_WRITE) - bcopy(sp->scp_data, bs->sc_bufp, bs->sc_seglen); - } - else - { - /* setup segaddr */ - bs->sc_segaddr = (u_int8_t *) phys; - /* setup seglen */ - endva = (vaddr_t) round_page((vaddr_t) sp->scp_data + sp->scp_datalen); - for (va = (vaddr_t) sp->scp_data; ; phys = nphys) - { - if ((va += PAGE_SIZE) >= endva) - { - bs->sc_seglen = sp->scp_datalen; - break; - } - - nphys = vtophys(va); - if (phys + PAGE_SIZE != nphys || nphys >= bs->sc_minphys) - { - bs->sc_seglen = - (u_int8_t *) trunc_page(va) - sp->scp_data; - break; - } - } - /* setup bufp */ - bs->sc_bufp = NULL; - } - - bshw_dmastart(ct); - cthw_set_count(chp, bs->sc_seglen); - ct_cr_write_1(chp, wd3s_cmd, WD3S_TFR_INFO); - return 0; -} - -void -bshw_dma_xfer_stop(struct ct_softc *ct) -{ - struct scsi_low_softc *slp = &ct->sc_sclow; - struct sc_p *sp = &slp->sl_scp; - struct bshw_softc *bs = ct->ct_hw; - struct targ_info *ti; - u_int count, transbytes; - - bshw_dmadone(ct); - - ti = slp->sl_Tnexus; - if (ti == NULL) - return; - - if (ti->ti_phase == PH_DATA) - { - count = cthw_get_count(&ct->sc_ch); - if (count < (u_int) bs->sc_seglen) - { - transbytes = bs->sc_seglen - count; - if (bs->sc_bufp != NULL && - sp->scp_direction == SCSI_LOW_READ) - bcopy(bs->sc_bufp, sp->scp_data, transbytes); - - sp->scp_data += transbytes; - sp->scp_datalen -= transbytes; - } - else if (count > (u_int) bs->sc_seglen) - { - device_printf(slp->sl_dev, - "port data %x != seglen %x\n", - count, bs->sc_seglen); - slp->sl_error |= PDMAERR; - } - - scsi_low_data_finish(slp); - } - else - { - device_printf(slp->sl_dev, "extra DMA interrupt\n"); - slp->sl_error |= PDMAERR; - } - - bs->sc_bufp = NULL; -} - -/* common dma settings */ -#undef DMA1_SMSK -#define DMA1_SMSK (0x15) -#undef DMA1_MODE -#define DMA1_MODE (0x17) -#undef DMA1_FFC -#define DMA1_FFC (0x19) -#undef DMA1_CHN -#define DMA1_CHN(c) (0x01 + ((c) << 2)) - -#define DMA37SM_SET 0x04 -#define DMA37MD_WRITE 0x04 -#define DMA37MD_READ 0x08 -#define DMA37MD_SINGLE 0x40 - -static bus_addr_t dmapageport[4] = { 0x27, 0x21, 0x23, 0x25 }; - -static __inline void -bshw_dma_write_1(struct ct_bus_access_handle *chp, bus_addr_t port, - u_int8_t val) -{ - - CT_BUS_WEIGHT(chp); - outb(port, val); -} - -static void -bshw_dmastart(struct ct_softc *ct) -{ - struct scsi_low_softc *slp = &ct->sc_sclow; - struct bshw_softc *bs = ct->ct_hw; - struct ct_bus_access_handle *chp = &ct->sc_ch; - int chan = bs->sc_drq; - bus_addr_t waport; - u_int8_t regv, *phys = bs->sc_segaddr; - u_int nbytes = bs->sc_seglen; - - /* flush cpu cache */ - (*bs->sc_dmasync_before) (ct); - - /* - * Program one of DMA channels 0..3. These are - * byte mode channels. - */ - /* set dma channel mode, and reset address ff */ - - if (slp->sl_scp.scp_direction == SCSI_LOW_READ) - regv = DMA37MD_WRITE | DMA37MD_SINGLE | chan; - else - regv = DMA37MD_READ | DMA37MD_SINGLE | chan; - - bshw_dma_write_1(chp, DMA1_MODE, regv); - bshw_dma_write_1(chp, DMA1_FFC, 0); - - /* send start address */ - waport = DMA1_CHN(chan); - bshw_dma_write_1(chp, waport, (u_int) phys); - bshw_dma_write_1(chp, waport, ((u_int) phys) >> 8); - bshw_dma_write_1(chp, dmapageport[chan], ((u_int) phys) >> 16); - - /* send count */ - bshw_dma_write_1(chp, waport + 2, --nbytes); - bshw_dma_write_1(chp, waport + 2, nbytes >> 8); - - /* vendor unique hook */ - if (bs->sc_hw->hw_dma_start) - (*bs->sc_hw->hw_dma_start)(ct); - - bshw_dma_write_1(chp, DMA1_SMSK, chan); - ct_cmdp_write_1(chp, CMDP_DMES); -} - -static void -bshw_dmadone(struct ct_softc *ct) -{ - struct bshw_softc *bs = ct->ct_hw; - struct ct_bus_access_handle *chp = &ct->sc_ch; - - bshw_dma_write_1(chp, DMA1_SMSK, (bs->sc_drq | DMA37SM_SET)); - ct_cmdp_write_1(chp, CMDP_DMER); - - /* vendor unique hook */ - if (bs->sc_hw->hw_dma_stop) - (*bs->sc_hw->hw_dma_stop) (ct); - - /* flush cpu cache */ - (*bs->sc_dmasync_after) (ct); -} - -/********************************************** - * VENDOR UNIQUE DMA FUNCS - **********************************************/ -static int bshw_dma_init_sc98(struct ct_softc *); -static void bshw_dma_start_sc98(struct ct_softc *); -static void bshw_dma_stop_sc98(struct ct_softc *); -static int bshw_dma_init_texa(struct ct_softc *); -static void bshw_dma_start_elecom(struct ct_softc *); -static void bshw_dma_stop_elecom(struct ct_softc *); - -static int -bshw_dma_init_texa(struct ct_softc *ct) -{ - struct ct_bus_access_handle *chp = &ct->sc_ch; - u_int8_t regval; - - if ((regval = ct_cr_read_1(chp, 0x37)) & 0x08) - return 0; - - ct_cr_write_1(chp, 0x37, regval | 0x08); - regval = ct_cr_read_1(chp, 0x3f); - ct_cr_write_1(chp, 0x3f, regval | 0x08); - return 1; -} - -static int -bshw_dma_init_sc98(struct ct_softc *ct) -{ - struct ct_bus_access_handle *chp = &ct->sc_ch; - - if (ct_cr_read_1(chp, 0x37) & 0x08) - return 0; - - /* If your card is SC98 with bios ver 1.01 or 1.02 under no PCI */ - ct_cr_write_1(chp, 0x37, 0x1a); - ct_cr_write_1(chp, 0x3f, 0x1a); -#if 0 - /* only valid for IO */ - ct_cr_write_1(chp, 0x40, 0xf4); - ct_cr_write_1(chp, 0x41, 0x9); - ct_cr_write_1(chp, 0x43, 0xff); - ct_cr_write_1(chp, 0x46, 0x4e); - - ct_cr_write_1(chp, 0x48, 0xf4); - ct_cr_write_1(chp, 0x49, 0x9); - ct_cr_write_1(chp, 0x4b, 0xff); - ct_cr_write_1(chp, 0x4e, 0x4e); -#endif - return 1; -} - -static void -bshw_dma_start_sc98(struct ct_softc *ct) -{ - struct ct_bus_access_handle *chp = &ct->sc_ch; - - ct_cr_write_1(chp, 0x73, 0x32); - ct_cr_write_1(chp, 0x74, 0x23); -} - -static void -bshw_dma_stop_sc98(struct ct_softc *ct) -{ - struct ct_bus_access_handle *chp = &ct->sc_ch; - - ct_cr_write_1(chp, 0x73, 0x43); - ct_cr_write_1(chp, 0x74, 0x34); -} - -static void -bshw_dma_start_elecom(struct ct_softc *ct) -{ - struct ct_bus_access_handle *chp = &ct->sc_ch; - u_int8_t tmp = ct_cr_read_1(chp, 0x4c); - - ct_cr_write_1(chp, 0x32, tmp & 0xdf); -} - -static void -bshw_dma_stop_elecom(struct ct_softc *ct) -{ - struct ct_bus_access_handle *chp = &ct->sc_ch; - u_int8_t tmp = ct_cr_read_1(chp, 0x4c); - - ct_cr_write_1(chp, 0x32, tmp | 0x20); -} - -static struct bshw bshw_generic = { - BSHW_SYNC_RELOAD, - - 0, - - NULL, - NULL, - NULL, -}; - -static struct bshw bshw_sc98 = { - BSHW_DOUBLE_DMACHAN, - - 0x60, - - bshw_dma_init_sc98, - bshw_dma_start_sc98, - bshw_dma_stop_sc98, -}; - -static struct bshw bshw_texa = { - BSHW_DOUBLE_DMACHAN, - - 0x60, - - bshw_dma_init_texa, - NULL, - NULL, -}; - -static struct bshw bshw_elecom = { - 0, - - 0x38, - - NULL, - bshw_dma_start_elecom, - bshw_dma_stop_elecom, -}; - -static struct bshw bshw_lc_smit = { - BSHW_SMFIFO | BSHW_DOUBLE_DMACHAN, - - 0x60, - - NULL, - NULL, - NULL, -}; - -static struct bshw bshw_lha20X = { - BSHW_DOUBLE_DMACHAN, - - 0x60, - - NULL, - NULL, - NULL, -}; - -/* hw tabs */ -static dvcfg_hw_t bshw_hwsel_array[] = { -/* 0x00 */ &bshw_generic, -/* 0x01 */ &bshw_sc98, -/* 0x02 */ &bshw_texa, -/* 0x03 */ &bshw_elecom, -/* 0x04 */ &bshw_lc_smit, -/* 0x05 */ &bshw_lha20X, -}; - -struct dvcfg_hwsel bshw_hwsel = { - DVCFG_HWSEL_SZ(bshw_hwsel_array), - bshw_hwsel_array -}; diff --git a/sys/dev/ct/bshwvar.h b/sys/dev/ct/bshwvar.h deleted file mode 100644 index ba42a7206979..000000000000 --- a/sys/dev/ct/bshwvar.h +++ /dev/null @@ -1,96 +0,0 @@ -/* $FreeBSD$ */ -/* $NecBSD: bshwvar.h,v 1.3.14.3 2001/06/21 04:07:37 honda Exp $ */ -/* $NetBSD$ */ - -/*- - * [NetBSD for NEC PC-98 series] - * Copyright (c) 1994, 1995, 1996, 1997, 1998 - * NetBSD/pc98 porting staff. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ -#ifndef _BSHWVAR_H_ -#define _BSHWVAR_H_ - -/* - * bshwvar.h - * NEC 55 compatible board specific definitions - */ - -#define BSHW_DEFAULT_CHIPCLK 20 /* 20MHz */ -#define BSHW_DEFAULT_HOSTID 7 - -struct bshw { -#define BSHW_SYNC_RELOAD 0x01 -#define BSHW_SMFIFO 0x02 -#define BSHW_DOUBLE_DMACHAN 0x04 - u_int hw_flags; - u_int hw_sregaddr; - - int ((*hw_dma_init)(struct ct_softc *)); - void ((*hw_dma_start)(struct ct_softc *)); - void ((*hw_dma_stop)(struct ct_softc *)); -}; - -struct bshw_softc { - int sc_hostid; - int sc_irq; /* irq */ - int sc_drq; /* drq */ - - /* dma transfer */ - u_int8_t *sc_segaddr; - u_int8_t *sc_bufp; - int sc_seglen; - u_int sc_sdatalen; /* SMIT */ - u_int sc_edatalen; /* SMIT */ - - /* private bounce */ - u_int8_t *sc_bounce_phys; - u_int8_t *sc_bounce_addr; - u_int sc_bounce_size; - bus_addr_t sc_minphys; - - /* io control */ -#define BSHW_READ_INTERRUPT_DRIVEN 0x0001 -#define BSHW_WRITE_INTERRUPT_DRIVEN 0x0002 -#define BSHW_DMA_BLOCK 0x0010 -#define BSHW_SMIT_BLOCK 0x0020 - u_int sc_io_control; - - /* hardware */ - struct bshw *sc_hw; - void ((*sc_dmasync_before))(struct ct_softc *); - void ((*sc_dmasync_after))(struct ct_softc *); -}; - -void bshw_synch_setup(struct ct_softc *, struct targ_info *); -void bshw_bus_reset(struct ct_softc *); -int bshw_read_settings(struct ct_bus_access_handle *, struct bshw_softc *); -int bshw_smit_xfer_start(struct ct_softc *); -void bshw_smit_xfer_stop(struct ct_softc *); -int bshw_dma_xfer_start(struct ct_softc *); -void bshw_dma_xfer_stop(struct ct_softc *); - -extern struct dvcfg_hwsel bshw_hwsel; -#endif /* !_BSHWVAR_H_ */ diff --git a/sys/dev/ct/ct.c b/sys/dev/ct/ct.c deleted file mode 100644 index 6a96c9c486e6..000000000000 --- a/sys/dev/ct/ct.c +++ /dev/null @@ -1,1242 +0,0 @@ -/* $NecBSD: ct.c,v 1.13.12.5 2001/06/26 07:31:53 honda Exp $ */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); -/* $NetBSD$ */ - -#define CT_DEBUG -#define CT_IO_CONTROL_FLAGS (CT_USE_CCSEQ | CT_FAST_INTR) - -/*- - * [NetBSD for NEC PC-98 series] - * Copyright (c) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 - * NetBSD/pc98 porting staff. All rights reserved. - * - * Copyright (c) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 - * Naofumi HONDA. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#include <sys/param.h> -#include <sys/systm.h> -#include <sys/kernel.h> -#include <sys/bio.h> -#include <sys/buf.h> -#include <sys/queue.h> -#include <sys/malloc.h> -#include <sys/errno.h> -#include <sys/rman.h> - -#include <machine/bus.h> - -#include <cam/scsi/scsi_low.h> - -#include <dev/ic/wd33c93reg.h> -#include <dev/ct/ctvar.h> -#include <dev/ct/ct_machdep.h> - -#define CT_NTARGETS 8 -#define CT_NLUNS 8 -#define CT_RESET_DEFAULT 2000 -#define CT_DELAY_MAX (2 * 1000 * 1000) -#define CT_DELAY_INTERVAL (1) - -/*************************************************** - * DEBUG - ***************************************************/ -#ifdef CT_DEBUG -int ct_debug; -#endif /* CT_DEBUG */ - -/*************************************************** - * IO control - ***************************************************/ -#define CT_USE_CCSEQ 0x0100 -#define CT_FAST_INTR 0x0200 - -u_int ct_io_control = CT_IO_CONTROL_FLAGS; - -/*************************************************** - * default data - ***************************************************/ -u_int8_t cthw_cmdlevel[256] = { -/* 0 1 2 3 4 5 6 7 8 9 A B C E D F */ -/*0*/0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,1 ,0 ,1 ,0 ,0 ,0 ,0 ,0 , -/*1*/0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , -/*2*/0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,1 ,0 ,1 ,0 ,0 ,0 ,0 ,0 , -/*3*/0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , -/*4*/0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , -/*5*/0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , -/*6*/0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , -/*7*/0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , -/*8*/0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , -/*9*/0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , -/*A*/0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , -/*B*/0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , -/*C*/0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , -/*D*/0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , -/*E*/0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , -/*F*/0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , -}; - -#if 0 -/* default synch data table */ -/* A 10 6.6 5.0 4.0 3.3 2.8 2.5 2.0 M/s */ -/* X 100 150 200 250 300 350 400 500 ns */ -static struct ct_synch_data ct_synch_data_FSCSI[] = { - {25, 0xa0}, {37, 0xb0}, {50, 0x20}, {62, 0xd0}, {75, 0x30}, - {87, 0xf0}, {100, 0x40}, {125, 0x50}, {0, 0} -}; - -static struct ct_synch_data ct_synch_data_SCSI[] = { - {50, 0x20}, {75, 0x30}, {100, 0x40}, {125, 0x50}, {0, 0} -}; -#endif -/*************************************************** - * DEVICE STRUCTURE - ***************************************************/ -extern struct cfdriver ct_cd; - -/***************************************************************** - * Interface functions - *****************************************************************/ -static int ct_xfer(struct ct_softc *, u_int8_t *, int, int, u_int *); -static void ct_io_xfer(struct ct_softc *); -static int ct_reselected(struct ct_softc *, u_int8_t); -static void ct_phase_error(struct ct_softc *, u_int8_t); -static int ct_start_selection(struct ct_softc *, struct slccb *); -static int ct_msg(struct ct_softc *, struct targ_info *, u_int); -static int ct_world_start(struct ct_softc *, int); -static __inline void cthw_phase_bypass(struct ct_softc *, u_int8_t); -static int cthw_chip_reset(struct ct_bus_access_handle *, int *, int, int); -static void cthw_bus_reset(struct ct_softc *); -static int ct_ccb_nexus_establish(struct ct_softc *); -static int ct_lun_nexus_establish(struct ct_softc *); -static int ct_target_nexus_establish(struct ct_softc *, int, int); -static void cthw_attention(struct ct_softc *); -static int ct_targ_init(struct ct_softc *, struct targ_info *, int); -static int ct_unbusy(struct ct_softc *); -static void ct_attention(struct ct_softc *); -static struct ct_synch_data *ct_make_synch_table(struct ct_softc *); -static int ct_catch_intr(struct ct_softc *); -static int ct_poll(void *); - -struct scsi_low_funcs ct_funcs = { - SC_LOW_INIT_T ct_world_start, - SC_LOW_BUSRST_T cthw_bus_reset, - SC_LOW_TARG_INIT_T ct_targ_init, - SC_LOW_LUN_INIT_T NULL, - - SC_LOW_SELECT_T ct_start_selection, - SC_LOW_NEXUS_T ct_lun_nexus_establish, - SC_LOW_NEXUS_T ct_ccb_nexus_establish, - - SC_LOW_ATTEN_T cthw_attention, - SC_LOW_MSG_T ct_msg, - - SC_LOW_TIMEOUT_T NULL, - SC_LOW_POLL_T ct_poll, - - NULL, /* SC_LOW_POWER_T cthw_power, */ -}; - -/************************************************** - * HW functions - **************************************************/ -static __inline void -cthw_phase_bypass(struct ct_softc *ct, u_int8_t ph) -{ - struct ct_bus_access_handle *chp = &ct->sc_ch; - - ct_cr_write_1(chp, wd3s_cph, ph); - ct_cr_write_1(chp, wd3s_cmd, WD3S_SELECT_ATN_TFR); -} - -static void -cthw_bus_reset(struct ct_softc *ct) -{ - - /* - * wd33c93 does not have bus reset function. - */ - if (ct->ct_bus_reset != NULL) - ((*ct->ct_bus_reset) (ct)); -} - -static int -cthw_chip_reset(struct ct_bus_access_handle *chp, int *chiprevp, int chipclk, - int hostid) -{ -#define CT_SELTIMEOUT_20MHz_REGV (0x80) - u_int8_t aux, regv; - u_int seltout; - int wc; - - /* issue abort cmd */ - ct_cr_write_1(chp, wd3s_cmd, WD3S_ABORT); - DELAY(1000); /* 1ms wait */ - (void) ct_stat_read_1(chp); - (void) ct_cr_read_1(chp, wd3s_stat); - - /* setup chip registers */ - regv = 0; - seltout = CT_SELTIMEOUT_20MHz_REGV; - switch (chipclk) - { - case 8: - case 10: - seltout = (seltout * chipclk) / 20; - regv = IDR_FS_8_10; - break; - - case 12: - case 15: - seltout = (seltout * chipclk) / 20; - regv = IDR_FS_12_15; - break; - - case 16: - case 20: - seltout = (seltout * chipclk) / 20; - regv = IDR_FS_16_20; - break; - - default: - panic("ct: illegal chip clk rate"); - break; - } - - regv |= IDR_EHP | hostid | IDR_RAF | IDR_EAF; - ct_cr_write_1(chp, wd3s_oid, regv); - - ct_cr_write_1(chp, wd3s_cmd, WD3S_RESET); - for (wc = CT_RESET_DEFAULT; wc > 0; wc --) - { - aux = ct_stat_read_1(chp); - if (aux != 0xff && (aux & STR_INT)) - { - regv = ct_cr_read_1(chp, wd3s_stat); - if (regv == BSR_RESET || regv == BSR_AFM_RESET) - break; - - ct_cr_write_1(chp, wd3s_cmd, WD3S_RESET); - } - DELAY(1); - } - if (wc == 0) - return ENXIO; - - ct_cr_write_1(chp, wd3s_tout, seltout); - ct_cr_write_1(chp, wd3s_sid, SIDR_RESEL); - ct_cr_write_1(chp, wd3s_ctrl, CR_DEFAULT); - ct_cr_write_1(chp, wd3s_synch, 0); - if (chiprevp != NULL) - { - *chiprevp = CT_WD33C93; - if (regv == BSR_RESET) - goto out; - - *chiprevp = CT_WD33C93_A; - ct_cr_write_1(chp, wd3s_qtag, 0xaa); - if (ct_cr_read_1(chp, wd3s_qtag) != 0xaa) - { - ct_cr_write_1(chp, wd3s_qtag, 0x0); - goto out; - } - ct_cr_write_1(chp, wd3s_qtag, 0x55); - if (ct_cr_read_1(chp, wd3s_qtag) != 0x55) - { - ct_cr_write_1(chp, wd3s_qtag, 0x0); - goto out; - } - ct_cr_write_1(chp, wd3s_qtag, 0x0); - *chiprevp = CT_WD33C93_B; - } - -out: - (void) ct_stat_read_1(chp); - (void) ct_cr_read_1(chp, wd3s_stat); - return 0; -} - -static struct ct_synch_data * -ct_make_synch_table(struct ct_softc *ct) -{ - struct ct_synch_data *sdtp, *sdp; - u_int base, i, period; - - sdtp = sdp = &ct->sc_default_sdt[0]; - - if ((ct->sc_chipclk % 5) == 0) - base = 1000 / (5 * 2); /* 5 MHz type */ - else - base = 1000 / (4 * 2); /* 4 MHz type */ - - if (ct->sc_chiprev >= CT_WD33C93_B) - { - /* fast scsi */ - for (i = 2; i < 8; i ++, sdp ++) - { - period = (base * i) / 2; - if (period >= 200) /* 5 MHz */ - break; - sdp->cs_period = period / 4; - sdp->cs_syncr = (i * 0x10) | 0x80; - } - } - - for (i = 2; i < 8; i ++, sdp ++) - { - period = (base * i); - if (period > 500) /* 2 MHz */ - break; - sdp->cs_period = period / 4; - sdp->cs_syncr = (i * 0x10); - } - - sdp->cs_period = 0; - sdp->cs_syncr = 0; - return sdtp; -} - -/************************************************** - * Attach & Probe - **************************************************/ -int -ctprobesubr(struct ct_bus_access_handle *chp, u_int dvcfg, int hsid, - u_int chipclk, int *chiprevp) -{ - -#if 0 - if ((ct_stat_read_1(chp) & STR_BSY) != 0) - return 0; -#endif - if (cthw_chip_reset(chp, chiprevp, chipclk, hsid) != 0) - return 0; - return 1; -} - -void -ctattachsubr(struct ct_softc *ct) -{ - struct scsi_low_softc *slp = &ct->sc_sclow; - - ct->sc_tmaxcnt = SCSI_LOW_MIN_TOUT * 1000 * 1000; /* default */ - slp->sl_funcs = &ct_funcs; - slp->sl_flags |= HW_READ_PADDING; - (void) scsi_low_attach(slp, 0, CT_NTARGETS, CT_NLUNS, - sizeof(struct ct_targ_info), 0); -} - -/************************************************** - * SCSI LOW interface functions - **************************************************/ -static void -cthw_attention(struct ct_softc *ct) -{ - struct ct_bus_access_handle *chp = &ct->sc_ch; - - ct->sc_atten = 1; - if ((ct_stat_read_1(chp) & (STR_BSY | STR_CIP)) != 0) - return; - - ct_cr_write_1(chp, wd3s_cmd, WD3S_ASSERT_ATN); - DELAY(10); - if ((ct_stat_read_1(chp) & STR_LCI) == 0) - ct->sc_atten = 0; - ct_unbusy(ct); - return; -} - -static void -ct_attention(struct ct_softc *ct) -{ - struct scsi_low_softc *slp = &ct->sc_sclow; - - if (slp->sl_atten == 0) - { - ct_unbusy(ct); - scsi_low_attention(slp); - } - else if (ct->sc_atten != 0) - { - ct_unbusy(ct); - cthw_attention(ct); - } -} - -static int -ct_targ_init(struct ct_softc *ct, struct targ_info *ti, int action) -{ - struct ct_targ_info *cti = (void *) ti; - - if (action == SCSI_LOW_INFO_ALLOC || action == SCSI_LOW_INFO_REVOKE) - { - if (ct->sc_sdp == NULL) - { - ct->sc_sdp = ct_make_synch_table(ct); - } - - switch (ct->sc_chiprev) - { - default: - ti->ti_maxsynch.offset = 5; - break; - - case CT_WD33C93_A: - case CT_AM33C93_A: - ti->ti_maxsynch.offset = 12; - break; - - case CT_WD33C93_B: - case CT_WD33C93_C: - ti->ti_maxsynch.offset = 12; - break; - } - - ti->ti_maxsynch.period = ct->sc_sdp[0].cs_period; - ti->ti_width = SCSI_LOW_BUS_WIDTH_8; - cti->cti_syncreg = 0; - } - - return 0; -} - -static int -ct_world_start(struct ct_softc *ct, int fdone) -{ - struct scsi_low_softc *slp = &ct->sc_sclow; - struct ct_bus_access_handle *chp = &ct->sc_ch; - - if (ct->sc_sdp == NULL) - { - ct->sc_sdp = ct_make_synch_table(ct); - } - - if (slp->sl_cfgflags & CFG_NOPARITY) - ct->sc_creg = CR_DEFAULT; - else - ct->sc_creg = CR_DEFAULT_HP; - - if (ct->sc_dma & CT_DMA_DMASTART) - (*ct->ct_dma_xfer_stop) (ct); - if (ct->sc_dma & CT_DMA_PIOSTART) - (*ct->ct_pio_xfer_stop) (ct); - ct->sc_dma = 0; - ct->sc_atten = 0; - - cthw_chip_reset(chp, NULL, ct->sc_chipclk, slp->sl_hostid); - scsi_low_bus_reset(slp); - cthw_chip_reset(chp, NULL, ct->sc_chipclk, slp->sl_hostid); - - return 0; -} - -static int -ct_start_selection(struct ct_softc *ct, struct slccb *cb) -{ - struct scsi_low_softc *slp = &ct->sc_sclow; - struct ct_bus_access_handle *chp = &ct->sc_ch; - - struct targ_info *ti = slp->sl_Tnexus; - struct lun_info *li = slp->sl_Lnexus; - int s, satok; - u_int8_t cmd; - - ct->sc_tmaxcnt = cb->ccb_tcmax * 1000 * 1000; - ct->sc_atten = 0; - satok = 0; - - if (scsi_low_is_disconnect_ok(cb) != 0) - { - if (ct->sc_chiprev >= CT_WD33C93_A) - satok = 1; - else if (cthw_cmdlevel[slp->sl_scp.scp_cmd[0]] != 0) - satok = 1; - } - - if (satok != 0 && - scsi_low_is_msgout_continue(ti, SCSI_LOW_MSG_IDENTIFY) == 0) - { - cmd = WD3S_SELECT_ATN_TFR; - ct->sc_satgo = CT_SAT_GOING; - } - else - { - cmd = WD3S_SELECT_ATN; - ct->sc_satgo = 0; - } - - if ((ct_stat_read_1(chp) & (STR_BSY | STR_INT | STR_CIP)) != 0) - return SCSI_LOW_START_FAIL; - - if ((ct->sc_satgo & CT_SAT_GOING) != 0) - { - (void) scsi_low_msgout(slp, ti, SCSI_LOW_MSGOUT_INIT); - scsi_low_cmd(slp, ti); - ct_cr_write_1(chp, wd3s_oid, slp->sl_scp.scp_cmdlen); - ct_write_cmds(chp, slp->sl_scp.scp_cmd, slp->sl_scp.scp_cmdlen); - } - else - { - /* anyway attention assert */ - SCSI_LOW_ASSERT_ATN(slp); - } - - ct_target_nexus_establish(ct, li->li_lun, slp->sl_scp.scp_direction); - - s = splhigh(); - if ((ct_stat_read_1(chp) & (STR_BSY | STR_INT | STR_CIP)) == 0) - { - /* XXX: - * Reload a lun again here. - */ - ct_cr_write_1(chp, wd3s_lun, li->li_lun); - ct_cr_write_1(chp, wd3s_cmd, cmd); - if ((ct_stat_read_1(chp) & STR_LCI) == 0) - { - splx(s); - SCSI_LOW_SETUP_PHASE(ti, PH_SELSTART); - return SCSI_LOW_START_OK; - } - } - splx(s); - return SCSI_LOW_START_FAIL; -} - -static int -ct_msg(struct ct_softc *ct, struct targ_info *ti, u_int msg) -{ - struct ct_bus_access_handle *chp = &ct->sc_ch; - struct ct_targ_info *cti = (void *) ti; - struct ct_synch_data *csp = ct->sc_sdp; - u_int offset, period; - int error; - - if ((msg & SCSI_LOW_MSG_WIDE) != 0) - { - if (ti->ti_width != SCSI_LOW_BUS_WIDTH_8) - { - ti->ti_width = SCSI_LOW_BUS_WIDTH_8; - return EINVAL; - } - return 0; - } - - if ((msg & SCSI_LOW_MSG_SYNCH) == 0) - return 0; - - offset = ti->ti_maxsynch.offset; - period = ti->ti_maxsynch.period; - for ( ; csp->cs_period != 0; csp ++) - { - if (period == csp->cs_period) - break; - } - - if (ti->ti_maxsynch.period != 0 && csp->cs_period == 0) - { - ti->ti_maxsynch.period = 0; - ti->ti_maxsynch.offset = 0; - cti->cti_syncreg = 0; - error = EINVAL; - } - else - { - cti->cti_syncreg = ((offset & 0x0f) | csp->cs_syncr); - error = 0; - } - - if (ct->ct_synch_setup != 0) - (*ct->ct_synch_setup) (ct, ti); - ct_cr_write_1(chp, wd3s_synch, cti->cti_syncreg); - return error; -} - -/************************************************* - * <DATA PHASE> - *************************************************/ -static int -ct_xfer(struct ct_softc *ct, u_int8_t *data, int len, int direction, - u_int *statp) -{ - struct ct_bus_access_handle *chp = &ct->sc_ch; - int wc; - register u_int8_t aux; - - *statp = 0; - if (len == 1) - { - ct_cr_write_1(chp, wd3s_cmd, WD3S_SBT | WD3S_TFR_INFO); - } - else - { - cthw_set_count(chp, len); - ct_cr_write_1(chp, wd3s_cmd, WD3S_TFR_INFO); - } - - aux = ct_stat_read_1(chp); - if ((aux & STR_LCI) != 0) - { - cthw_set_count(chp, 0); - return len; - } - - for (wc = 0; wc < ct->sc_tmaxcnt; wc ++) - { - /* check data ready */ - if ((aux & (STR_BSY | STR_DBR)) == (STR_BSY | STR_DBR)) - { - if (direction == SCSI_LOW_READ) - { - *data = ct_cr_read_1(chp, wd3s_data); - if ((aux & STR_PE) != 0) - *statp |= SCSI_LOW_DATA_PE; - } - else - { - ct_cr_write_1(chp, wd3s_data, *data); - } - len --; - if (len <= 0) - break; - data ++; - } - else - { - DELAY(1); - } - - /* check phase miss */ - aux = ct_stat_read_1(chp); - if ((aux & STR_INT) != 0) - break; - } - return len; -} - -#define CT_PADDING_BUF_SIZE 32 - -static void -ct_io_xfer(struct ct_softc *ct) -{ - struct scsi_low_softc *slp = &ct->sc_sclow; - struct ct_bus_access_handle *chp = &ct->sc_ch; - struct sc_p *sp = &slp->sl_scp; - u_int stat; - int len; - u_int8_t pbuf[CT_PADDING_BUF_SIZE]; - - /* polling mode */ - ct_cr_write_1(chp, wd3s_ctrl, ct->sc_creg); - - if (sp->scp_datalen <= 0) - { - slp->sl_error |= PDMAERR; - - if (slp->sl_scp.scp_direction == SCSI_LOW_WRITE) - bzero(pbuf, CT_PADDING_BUF_SIZE); - ct_xfer(ct, pbuf, CT_PADDING_BUF_SIZE, - sp->scp_direction, &stat); - } - else - { - len = ct_xfer(ct, sp->scp_data, sp->scp_datalen, - sp->scp_direction, &stat); - sp->scp_data += (sp->scp_datalen - len); - sp->scp_datalen = len; - } -} - -/************************************************** - * <PHASE ERROR> - **************************************************/ -struct ct_err { - u_char *pe_msg; - u_int pe_err; - u_int pe_errmsg; - int pe_done; -}; - -struct ct_err ct_cmderr[] = { -/*0*/ { "illegal cmd", FATALIO, SCSI_LOW_MSG_ABORT, 1}, -/*1*/ { "unexpected bus free", FATALIO, 0, 1}, -/*2*/ { NULL, SELTIMEOUTIO, 0, 1}, -/*3*/ { "scsi bus parity error", PARITYERR, SCSI_LOW_MSG_ERROR, 0}, -/*4*/ { "scsi bus parity error", PARITYERR, SCSI_LOW_MSG_ERROR, 0}, -/*5*/ { "unknown" , FATALIO, SCSI_LOW_MSG_ABORT, 1}, -/*6*/ { "miss reselection (target mode)", FATALIO, SCSI_LOW_MSG_ABORT, 0}, -/*7*/ { "wrong status byte", PARITYERR, SCSI_LOW_MSG_ERROR, 0}, -}; - -static void -ct_phase_error(struct ct_softc *ct, u_int8_t scsi_status) -{ - struct scsi_low_softc *slp = &ct->sc_sclow; - struct targ_info *ti = slp->sl_Tnexus; - struct ct_err *pep; - u_int msg = 0; - - if ((scsi_status & BSR_CM) == BSR_CMDERR && - (scsi_status & BSR_PHVALID) == 0) - { - pep = &ct_cmderr[scsi_status & BSR_PM]; - slp->sl_error |= pep->pe_err; - if ((pep->pe_err & PARITYERR) != 0) - { - if (ti->ti_phase == PH_MSGIN) - msg = SCSI_LOW_MSG_PARITY; - else - msg = SCSI_LOW_MSG_ERROR; - } - else - msg = pep->pe_errmsg; - - if (msg != 0) - scsi_low_assert_msg(slp, slp->sl_Tnexus, msg, 1); - - if (pep->pe_msg != NULL) - { - device_printf(slp->sl_dev, "phase error: %s", - pep->pe_msg); - scsi_low_print(slp, slp->sl_Tnexus); - } - - if (pep->pe_done != 0) - scsi_low_disconnected(slp, ti); - } - else - { - slp->sl_error |= FATALIO; - scsi_low_restart(slp, SCSI_LOW_RESTART_HARD, "phase error"); - } -} - -/************************************************** - * ### SCSI PHASE SEQUENCER ### - **************************************************/ -static int -ct_reselected(struct ct_softc *ct, u_int8_t scsi_status) -{ - struct scsi_low_softc *slp = &ct->sc_sclow; - struct ct_bus_access_handle *chp = &ct->sc_ch; - struct targ_info *ti; - u_int sid; - u_int8_t regv; - - ct->sc_atten = 0; - ct->sc_satgo &= ~CT_SAT_GOING; - regv = ct_cr_read_1(chp, wd3s_sid); - if ((regv & SIDR_VALID) == 0) - return EJUSTRETURN; - - sid = regv & SIDR_IDM; - if ((ti = scsi_low_reselected(slp, sid)) == NULL) - return EJUSTRETURN; - - ct_target_nexus_establish(ct, 0, SCSI_LOW_READ); - if (scsi_status != BSR_AFM_RESEL) - return EJUSTRETURN; - - SCSI_LOW_SETUP_PHASE(ti, PH_MSGIN); - regv = ct_cr_read_1(chp, wd3s_data); - if (scsi_low_msgin(slp, ti, (u_int) regv) == 0) - { - if (scsi_low_is_msgout_continue(ti, 0) != 0) - { - /* XXX: scsi_low_attetion */ - scsi_low_attention(slp); - } - } - - if (ct->sc_atten != 0) - { - ct_attention(ct); - } - - ct_cr_write_1(chp, wd3s_cmd, WD3S_NEGATE_ACK); - return EJUSTRETURN; -} - -static int -ct_target_nexus_establish(struct ct_softc *ct, int lun, int dir) -{ - struct scsi_low_softc *slp = &ct->sc_sclow; - struct ct_bus_access_handle *chp = &ct->sc_ch; - struct targ_info *ti = slp->sl_Tnexus; - struct ct_targ_info *cti = (void *) ti; - - if (dir == SCSI_LOW_WRITE) - ct_cr_write_1(chp, wd3s_did, ti->ti_id); - else - ct_cr_write_1(chp, wd3s_did, ti->ti_id | DIDR_DPD); - ct_cr_write_1(chp, wd3s_lun, lun); - ct_cr_write_1(chp, wd3s_ctrl, ct->sc_creg | CR_DMA); - ct_cr_write_1(chp, wd3s_cph, 0); - ct_cr_write_1(chp, wd3s_synch, cti->cti_syncreg); - cthw_set_count(chp, 0); - return 0; -} - -static int -ct_lun_nexus_establish(struct ct_softc *ct) -{ - struct scsi_low_softc *slp = &ct->sc_sclow; - struct ct_bus_access_handle *chp = &ct->sc_ch; - struct lun_info *li = slp->sl_Lnexus; - - ct_cr_write_1(chp, wd3s_lun, li->li_lun); - return 0; -} - -static int -ct_ccb_nexus_establish(struct ct_softc *ct) -{ - struct scsi_low_softc *slp = &ct->sc_sclow; - struct ct_bus_access_handle *chp = &ct->sc_ch; - struct lun_info *li = slp->sl_Lnexus; - struct targ_info *ti = slp->sl_Tnexus; - struct ct_targ_info *cti = (void *) ti; - struct slccb *cb = slp->sl_Qnexus; - - ct->sc_tmaxcnt = cb->ccb_tcmax * 1000 * 1000; - - if ((ct->sc_satgo & CT_SAT_GOING) != 0) - { - ct_cr_write_1(chp, wd3s_oid, slp->sl_scp.scp_cmdlen); - ct_write_cmds(chp, slp->sl_scp.scp_cmd, slp->sl_scp.scp_cmdlen); - } - if (slp->sl_scp.scp_direction == SCSI_LOW_WRITE) - ct_cr_write_1(chp, wd3s_did, ti->ti_id); - else - ct_cr_write_1(chp, wd3s_did, ti->ti_id | DIDR_DPD); - ct_cr_write_1(chp, wd3s_lun, li->li_lun); - ct_cr_write_1(chp, wd3s_synch, cti->cti_syncreg); - return 0; -} - -static int -ct_unbusy(struct ct_softc *ct) -{ - struct scsi_low_softc *slp = &ct->sc_sclow; - struct ct_bus_access_handle *chp = &ct->sc_ch; - int wc; - register u_int8_t regv; - - for (wc = 0; wc < CT_DELAY_MAX / CT_DELAY_INTERVAL; wc ++) - { - regv = ct_stat_read_1(chp); - if ((regv & (STR_BSY | STR_CIP)) == 0) - return 0; - if (regv == (u_int8_t) -1) - return EIO; - - DELAY(CT_DELAY_INTERVAL); - } - - device_printf(slp->sl_dev, "unbusy timeout\n"); - return EBUSY; -} - -static int -ct_catch_intr(struct ct_softc *ct) -{ - struct ct_bus_access_handle *chp = &ct->sc_ch; - int wc; - register u_int8_t regv; - - for (wc = 0; wc < CT_DELAY_MAX / CT_DELAY_INTERVAL; wc ++) - { - regv = ct_stat_read_1(chp); - if ((regv & (STR_INT | STR_BSY | STR_CIP)) == STR_INT) - return 0; - - DELAY(CT_DELAY_INTERVAL); - } - return EJUSTRETURN; -} - -void -ctintr(void *arg) -{ - struct ct_softc *ct = arg; - struct scsi_low_softc *slp = &ct->sc_sclow; - - SCSI_LOW_LOCK(slp); - ct_poll(ct); - SCSI_LOW_UNLOCK(slp); -} - -static int -ct_poll(void *arg) -{ - struct ct_softc *ct = arg; - struct scsi_low_softc *slp = &ct->sc_sclow; - struct ct_bus_access_handle *chp = &ct->sc_ch; - struct targ_info *ti; - struct buf *bp; - u_int derror, flags; - int len, satgo, error; - u_int8_t scsi_status, regv; - -again: - if (slp->sl_flags & HW_INACTIVE) - return 0; - - /************************************************** - * Get status & bus phase - **************************************************/ - if ((ct_stat_read_1(chp) & STR_INT) == 0) - return 0; - - scsi_status = ct_cr_read_1(chp, wd3s_stat); - if (scsi_status == ((u_int8_t) -1)) - return 1; - - /************************************************** - * Check reselection, or nexus - **************************************************/ - if (scsi_status == BSR_RESEL || scsi_status == BSR_AFM_RESEL) - { - if (ct_reselected(ct, scsi_status) == EJUSTRETURN) - return 1; - } - - if ((ti = slp->sl_Tnexus) == NULL) - return 1; - - /************************************************** - * Debug section - **************************************************/ -#ifdef CT_DEBUG - if (ct_debug > 0) - { - scsi_low_print(slp, NULL); - device_printf(slp->sl_dev, "scsi_status 0x%x\n\n", - (u_int) scsi_status); -#ifdef KDB - if (ct_debug > 1) - kdb_enter(KDB_WHY_CAM, "ct"); -#endif /* KDB */ - } -#endif /* CT_DEBUG */ - - /************************************************** - * Internal scsi phase - **************************************************/ - satgo = ct->sc_satgo; - ct->sc_satgo &= ~CT_SAT_GOING; - - switch (ti->ti_phase) - { - case PH_SELSTART: - if ((satgo & CT_SAT_GOING) == 0) - { - if (scsi_status != BSR_SELECTED) - { - ct_phase_error(ct, scsi_status); - return 1; - } - scsi_low_arbit_win(slp); - SCSI_LOW_SETUP_PHASE(ti, PH_SELECTED); - return 1; - } - else - { - scsi_low_arbit_win(slp); - SCSI_LOW_SETUP_PHASE(ti, PH_MSGOUT); /* XXX */ - } - break; - - case PH_RESEL: - if ((scsi_status & BSR_PHVALID) == 0 || - (scsi_status & BSR_PM) != BSR_MSGIN) - { - scsi_low_restart(slp, SCSI_LOW_RESTART_HARD, - "phase miss after reselect"); - return 1; - } - break; - - default: - if (slp->sl_flags & HW_PDMASTART) - { - slp->sl_flags &= ~HW_PDMASTART; - if (ct->sc_dma & CT_DMA_DMASTART) - { - (*ct->ct_dma_xfer_stop) (ct); - ct->sc_dma &= ~CT_DMA_DMASTART; - } - else if (ct->sc_dma & CT_DMA_PIOSTART) - { - (*ct->ct_pio_xfer_stop) (ct); - ct->sc_dma &= ~CT_DMA_PIOSTART; - } - else - { - scsi_low_data_finish(slp); - } - } - break; - } - - /************************************************** - * parse scsi phase - **************************************************/ - if (scsi_status & BSR_PHVALID) - { - /************************************************** - * Normal SCSI phase. - **************************************************/ - if ((scsi_status & BSR_CM) == BSR_CMDABT) - { - ct_phase_error(ct, scsi_status); - return 1; - } - - switch (scsi_status & BSR_PM) - { - case BSR_DATAOUT: - SCSI_LOW_SETUP_PHASE(ti, PH_DATA); - if (scsi_low_data(slp, ti, &bp, SCSI_LOW_WRITE) != 0) - { - ct_attention(ct); - } - goto common_data_phase; - - case BSR_DATAIN: - SCSI_LOW_SETUP_PHASE(ti, PH_DATA); - if (scsi_low_data(slp, ti, &bp, SCSI_LOW_READ) != 0) - { - ct_attention(ct); - } - -common_data_phase: - if (slp->sl_scp.scp_datalen > 0) - { - slp->sl_flags |= HW_PDMASTART; - if ((ct->sc_xmode & CT_XMODE_PIO) != 0) - { - error = (*ct->ct_pio_xfer_start) (ct); - if (error == 0) - { - ct->sc_dma |= CT_DMA_PIOSTART; - return 1; - } - } - - if ((ct->sc_xmode & CT_XMODE_DMA) != 0) - { - error = (*ct->ct_dma_xfer_start) (ct); - if (error == 0) - { - ct->sc_dma |= CT_DMA_DMASTART; - return 1; - } - } - } - else - { - if (slp->sl_scp.scp_direction == SCSI_LOW_READ) - { - if (!(slp->sl_flags & HW_READ_PADDING)) - { - device_printf(slp->sl_dev, - "read padding required\n"); - return 1; - } - } - else - { - if (!(slp->sl_flags & HW_WRITE_PADDING)) - { - device_printf(slp->sl_dev, - "write padding required\n"); - return 1; - } - } - slp->sl_flags |= HW_PDMASTART; - } - - ct_io_xfer(ct); - return 1; - - case BSR_CMDOUT: - SCSI_LOW_SETUP_PHASE(ti, PH_CMD); - if (scsi_low_cmd(slp, ti) != 0) - { - ct_attention(ct); - } - - if (ct_xfer(ct, slp->sl_scp.scp_cmd, - slp->sl_scp.scp_cmdlen, - SCSI_LOW_WRITE, &derror) != 0) - { - device_printf(slp->sl_dev, - "scsi cmd xfer short\n"); - } - return 1; - - case BSR_STATIN: - SCSI_LOW_SETUP_PHASE(ti, PH_STAT); - if ((ct_io_control & CT_USE_CCSEQ) != 0) - { - if (scsi_low_is_msgout_continue(ti, 0) != 0 || - ct->sc_atten != 0) - { - ct_xfer(ct, ®v, 1, SCSI_LOW_READ, - &derror); - scsi_low_statusin(slp, ti, - regv | derror); - } - else - { - ct->sc_satgo |= CT_SAT_GOING; - cthw_set_count(chp, 0); - cthw_phase_bypass(ct, 0x41); - } - } - else - { - ct_xfer(ct, ®v, 1, SCSI_LOW_READ, &derror); - scsi_low_statusin(slp, ti, regv | derror); - } - return 1; - - case BSR_UNSPINFO0: - case BSR_UNSPINFO1: - device_printf(slp->sl_dev, "illegal bus phase (0x%x)\n", - (u_int) scsi_status); - scsi_low_print(slp, ti); - return 1; - - case BSR_MSGOUT: - SCSI_LOW_SETUP_PHASE(ti, PH_MSGOUT); - flags = SCSI_LOW_MSGOUT_UNIFY; - if (ti->ti_ophase != ti->ti_phase) - flags |= SCSI_LOW_MSGOUT_INIT; - len = scsi_low_msgout(slp, ti, flags); - - if (len > 1 && slp->sl_atten == 0) - { - ct_attention(ct); - } - - if (ct_xfer(ct, ti->ti_msgoutstr, len, - SCSI_LOW_WRITE, &derror) != 0) - { - device_printf(slp->sl_dev, - "scsi msgout xfer short\n"); - } - SCSI_LOW_DEASSERT_ATN(slp); - ct->sc_atten = 0; - return 1; - - case BSR_MSGIN:/* msg in */ - SCSI_LOW_SETUP_PHASE(ti, PH_MSGIN); - - ct_xfer(ct, ®v, 1, SCSI_LOW_READ, &derror); - if (scsi_low_msgin(slp, ti, regv | derror) == 0) - { - if (scsi_low_is_msgout_continue(ti, 0) != 0) - { - /* XXX: scsi_low_attetion */ - scsi_low_attention(slp); - } - } - - if ((ct_io_control & CT_FAST_INTR) != 0) - { - if (ct_catch_intr(ct) == 0) - goto again; - } - return 1; - } - } - else - { - /************************************************** - * Special SCSI phase - **************************************************/ - switch (scsi_status) - { - case BSR_SATSDP: /* SAT with save data pointer */ - SCSI_LOW_SETUP_PHASE(ti, PH_MSGIN); - ct->sc_satgo |= CT_SAT_GOING; - scsi_low_msgin(slp, ti, MSG_SAVESP); - cthw_phase_bypass(ct, 0x41); - return 1; - - case BSR_SATFIN: /* SAT COMPLETE */ - /* - * emulate statusin => msgin - */ - SCSI_LOW_SETUP_PHASE(ti, PH_STAT); - scsi_low_statusin(slp, ti, ct_cr_read_1(chp, wd3s_lun)); - - SCSI_LOW_SETUP_PHASE(ti, PH_MSGIN); - scsi_low_msgin(slp, ti, MSG_COMP); - - scsi_low_disconnected(slp, ti); - return 1; - - case BSR_ACKREQ: /* negate ACK */ - if (ct->sc_atten != 0) - { - ct_attention(ct); - } - - ct_cr_write_1(chp, wd3s_cmd, WD3S_NEGATE_ACK); - if ((ct_io_control & CT_FAST_INTR) != 0) - { - /* XXX: - * Should clear a pending interrupt and - * sync with a next interrupt! - */ - ct_catch_intr(ct); - } - return 1; - - case BSR_DISC: /* disconnect */ - if (slp->sl_msgphase == MSGPH_NULL && - (satgo & CT_SAT_GOING) != 0) - { - /* - * emulate disconnect msg - */ - SCSI_LOW_SETUP_PHASE(ti, PH_MSGIN); - scsi_low_msgin(slp, ti, MSG_DISCON); - } - scsi_low_disconnected(slp, ti); - return 1; - - default: - break; - } - } - - ct_phase_error(ct, scsi_status); - return 1; -} diff --git a/sys/dev/ct/ct_isa.c b/sys/dev/ct/ct_isa.c deleted file mode 100644 index 601f7fb06569..000000000000 --- a/sys/dev/ct/ct_isa.c +++ /dev/null @@ -1,382 +0,0 @@ -/* $NecBSD: ct_isa.c,v 1.6 1999/07/26 06:32:01 honda Exp $ */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); -/* $NetBSD$ */ - -/*- - * [NetBSD for NEC PC-98 series] - * Copyright (c) 1995, 1996, 1997, 1998 - * NetBSD/pc98 porting staff. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#define SCSIBUS_RESCAN - -#include <sys/param.h> -#include <sys/systm.h> -#include <sys/kernel.h> -#include <sys/bio.h> -#include <sys/buf.h> -#include <sys/queue.h> -#include <sys/malloc.h> -#include <sys/bus.h> -#include <sys/module.h> -#include <sys/errno.h> - -#include <vm/vm.h> - -#include <machine/bus.h> -#include <machine/resource.h> -#include <sys/bus.h> -#include <sys/rman.h> -#include <machine/md_var.h> - -#include <pc98/cbus/cbus.h> -#include <isa/isavar.h> - -#include <compat/netbsd/dvcfg.h> - -#include <cam/scsi/scsi_low.h> - -#include <dev/ic/wd33c93reg.h> -#include <dev/ct/ctvar.h> -#include <dev/ct/bshwvar.h> - -#define BSHW_IOSZ 0x08 -#define BSHW_IOBASE 0xcc0 -#define BSHW_MEMSZ (PAGE_SIZE * 2) - -static int ct_isa_match(device_t); -static int ct_isa_attach(device_t); -static int ct_space_map(device_t, struct bshw *, - struct resource **, struct resource **); -static void ct_space_unmap(device_t, struct ct_softc *); -static struct bshw *ct_find_hw(device_t); -static void ct_dmamap(void *, bus_dma_segment_t *, int, int); -static void ct_isa_bus_access_weight(struct ct_bus_access_handle *); -static void ct_isa_dmasync_before(struct ct_softc *); -static void ct_isa_dmasync_after(struct ct_softc *); - -struct ct_isa_softc { - struct ct_softc sc_ct; - struct bshw_softc sc_bshw; -}; - -static struct isa_pnp_id ct_pnp_ids[] = { - { 0x0100e7b1, "Logitec LHA-301" }, - { 0x110154dc, "I-O DATA SC-98III" }, - { 0x4120acb4, "MELCO IFC-NN" }, - { 0, NULL } -}; - -static device_method_t ct_isa_methods[] = { - /* Device interface */ - DEVMETHOD(device_probe, ct_isa_match), - DEVMETHOD(device_attach, ct_isa_attach), - { 0, 0 } -}; - -static driver_t ct_isa_driver = { - "ct", ct_isa_methods, sizeof(struct ct_isa_softc), -}; - -static devclass_t ct_devclass; - -DRIVER_MODULE(ct, isa, ct_isa_driver, ct_devclass, 0, 0); - -static int -ct_isa_match(device_t dev) -{ - struct bshw *hw; - struct resource *port_res, *mem_res; - struct ct_bus_access_handle ch; - int rv; - - if (ISA_PNP_PROBE(device_get_parent(dev), dev, ct_pnp_ids) == ENXIO) - return ENXIO; - - switch (isa_get_logicalid(dev)) { - case 0x0100e7b1: /* LHA-301 */ - case 0x110154dc: /* SC-98III */ - case 0x4120acb4: /* IFC-NN */ - /* XXX - force to SMIT mode */ - device_set_flags(dev, device_get_flags(dev) | 0x40000); - break; - } - - if (isa_get_port(dev) == -1) - bus_set_resource(dev, SYS_RES_IOPORT, 0, - BSHW_IOBASE, BSHW_IOSZ); - - if ((hw = ct_find_hw(dev)) == NULL) - return ENXIO; - if (ct_space_map(dev, hw, &port_res, &mem_res) != 0) - return ENXIO; - - bzero(&ch, sizeof(ch)); - ch.ch_io = port_res; - ch.ch_bus_weight = ct_isa_bus_access_weight; - - rv = ctprobesubr(&ch, 0, BSHW_DEFAULT_HOSTID, - BSHW_DEFAULT_CHIPCLK, NULL); - if (rv != 0) - { - struct bshw_softc bshw_tab; - struct bshw_softc *bs = &bshw_tab; - - memset(bs, 0, sizeof(*bs)); - bshw_read_settings(&ch, bs); - bus_set_resource(dev, SYS_RES_IRQ, 0, bs->sc_irq, 1); - bus_set_resource(dev, SYS_RES_DRQ, 0, bs->sc_drq, 1); - } - - bus_release_resource(dev, SYS_RES_IOPORT, 0, port_res); - if (mem_res != NULL) - bus_release_resource(dev, SYS_RES_MEMORY, 0, mem_res); - - if (rv != 0) - return (BUS_PROBE_DEFAULT); - return ENXIO; -} - -static int -ct_isa_attach(device_t dev) -{ - struct ct_isa_softc *pct = device_get_softc(dev); - struct ct_softc *ct = &pct->sc_ct; - struct ct_bus_access_handle *chp = &ct->sc_ch; - struct scsi_low_softc *slp = &ct->sc_sclow; - struct bshw_softc *bs = &pct->sc_bshw; - struct bshw *hw; - int irq_rid, drq_rid, chiprev; - u_int8_t *vaddr; - bus_addr_t addr; - - hw = ct_find_hw(dev); - if (ct_space_map(dev, hw, &ct->port_res, &ct->mem_res) != 0) { - device_printf(dev, "bus io mem map failed\n"); - return ENXIO; - } - - chp->ch_io = ct->port_res; - chp->ch_mem = ct->mem_res; - chp->ch_bus_weight = ct_isa_bus_access_weight; - - irq_rid = 0; - ct->irq_res = bus_alloc_resource_any(dev, SYS_RES_IRQ, &irq_rid, - RF_ACTIVE); - drq_rid = 0; - ct->drq_res = bus_alloc_resource_any(dev, SYS_RES_DRQ, &drq_rid, - RF_ACTIVE); - if (ct->irq_res == NULL || ct->drq_res == NULL) { - ct_space_unmap(dev, ct); - return ENXIO; - } - - if (ctprobesubr(chp, 0, BSHW_DEFAULT_HOSTID, - BSHW_DEFAULT_CHIPCLK, &chiprev) == 0) - { - device_printf(dev, "hardware missing\n"); - ct_space_unmap(dev, ct); - return ENXIO; - } - - /* setup DMA map */ - if (bus_dma_tag_create(NULL, 1, 0, - BUS_SPACE_MAXADDR_24BIT, BUS_SPACE_MAXADDR, - NULL, NULL, DFLTPHYS, 1, - BUS_SPACE_MAXSIZE_32BIT, - BUS_DMA_ALLOCNOW, NULL, NULL, - &ct->sc_dmat) != 0) { - device_printf(dev, "can't set up ISA DMA map\n"); - ct_space_unmap(dev, ct); - return ENXIO; - } - - if (bus_dmamem_alloc(ct->sc_dmat, (void **)&vaddr, BUS_DMA_NOWAIT, - &ct->sc_dmamapt) != 0) { - device_printf(dev, "can't set up ISA DMA map\n"); - ct_space_unmap(dev, ct); - return ENXIO; - } - - bus_dmamap_load(ct->sc_dmat, ct->sc_dmamapt, vaddr, DFLTPHYS, - ct_dmamap, &addr, BUS_DMA_NOWAIT); - - /* setup machdep softc */ - bs->sc_hw = hw; - bs->sc_io_control = 0; - bs->sc_bounce_phys = (u_int8_t *)addr; - bs->sc_bounce_addr = vaddr; - bs->sc_bounce_size = DFLTPHYS; - bs->sc_minphys = (1 << 24); - bs->sc_dmasync_before = ct_isa_dmasync_before; - bs->sc_dmasync_after = ct_isa_dmasync_after; - bshw_read_settings(chp, bs); - - /* setup ct driver softc */ - ct->ct_hw = bs; - ct->ct_dma_xfer_start = bshw_dma_xfer_start; - ct->ct_pio_xfer_start = bshw_smit_xfer_start; - ct->ct_dma_xfer_stop = bshw_dma_xfer_stop; - ct->ct_pio_xfer_stop = bshw_smit_xfer_stop; - ct->ct_bus_reset = bshw_bus_reset; - ct->ct_synch_setup = bshw_synch_setup; - - ct->sc_xmode = CT_XMODE_DMA; - if (chp->ch_mem != NULL) - ct->sc_xmode |= CT_XMODE_PIO; - - ct->sc_chiprev = chiprev; - switch (chiprev) - { - case CT_WD33C93: - /* s = "WD33C93"; */ - ct->sc_chipclk = 8; - break; - case CT_WD33C93_A: - if (DVCFG_MAJOR(device_get_flags(dev)) > 0) - { - /* s = "AM33C93_A"; */ - ct->sc_chipclk = 20; - ct->sc_chiprev = CT_AM33C93_A; - } - else - { - /* s = "WD33C93_A"; */ - ct->sc_chipclk = 10; - } - break; - - case CT_AM33C93_A: - /* s = "AM33C93_A"; */ - ct->sc_chipclk = 20; - break; - - default: - case CT_WD33C93_B: - /* s = "WD33C93_B"; */ - ct->sc_chipclk = 20; - break; - } -#if 0 - printf("%s: chiprev %s chipclk %d MHz\n", - slp->sl_dev.dv_xname, s, ct->sc_chipclk); -#endif - - slp->sl_dev = dev; - slp->sl_hostid = bs->sc_hostid; - slp->sl_cfgflags = device_get_flags(dev); - mtx_init(&slp->sl_lock, "ct", NULL, MTX_DEF); - - ctattachsubr(ct); - - if (bus_setup_intr(dev, ct->irq_res, INTR_TYPE_CAM | INTR_MPSAFE, - NULL, ctintr, ct, &ct->sc_ih)) { - ct_space_unmap(dev, ct); - return ENXIO; - } - - return 0; -} - -static struct bshw * -ct_find_hw(device_t dev) -{ - return DVCFG_HW(&bshw_hwsel, DVCFG_MAJOR(device_get_flags(dev))); -} - -static int -ct_space_map(device_t dev, struct bshw *hw, - struct resource **iohp, struct resource **memhp) -{ - int port_rid, mem_rid; - - *memhp = NULL; - - port_rid = 0; - *iohp = bus_alloc_resource_anywhere(dev, SYS_RES_IOPORT, &port_rid, - BSHW_IOSZ, RF_ACTIVE); - if (*iohp == NULL) - return ENXIO; - - if ((hw->hw_flags & BSHW_SMFIFO) == 0 || isa_get_maddr(dev) == -1) - return 0; - - mem_rid = 0; - *memhp = bus_alloc_resource_anywhere(dev, SYS_RES_MEMORY, &mem_rid, - BSHW_MEMSZ, RF_ACTIVE); - if (*memhp == NULL) { - bus_release_resource(dev, SYS_RES_IOPORT, port_rid, *iohp); - return ENXIO; - } - - return 0; -} - -static void -ct_space_unmap(device_t dev, struct ct_softc *ct) -{ - if (ct->port_res != NULL) - bus_release_resource(dev, SYS_RES_IOPORT, 0, ct->port_res); - if (ct->mem_res != NULL) - bus_release_resource(dev, SYS_RES_MEMORY, 0, ct->mem_res); - if (ct->irq_res != NULL) - bus_release_resource(dev, SYS_RES_IRQ, 0, ct->irq_res); - if (ct->drq_res != NULL) - bus_release_resource(dev, SYS_RES_DRQ, 0, ct->drq_res); -} - -static void -ct_dmamap(void *arg, bus_dma_segment_t *seg, int nseg, int error) -{ - bus_addr_t *addr = (bus_addr_t *)arg; - - *addr = seg->ds_addr; -} - -static void -ct_isa_bus_access_weight(struct ct_bus_access_handle *chp) -{ - - outb(0x5f, 0); -} - -static void -ct_isa_dmasync_before(struct ct_softc *ct) -{ - - if (need_pre_dma_flush) - wbinvd(); -} - -static void -ct_isa_dmasync_after(struct ct_softc *ct) -{ - - if (need_post_dma_flush) - invd(); -} diff --git a/sys/dev/ct/ct_machdep.h b/sys/dev/ct/ct_machdep.h deleted file mode 100644 index 7d92526125eb..000000000000 --- a/sys/dev/ct/ct_machdep.h +++ /dev/null @@ -1,186 +0,0 @@ -/* $FreeBSD$ */ -/* $NecBSD: ct_machdep.h,v 1.4.12.2 2001/06/20 06:13:34 honda Exp $ */ -/* $NetBSD$ */ - -/*- - * [NetBSD for NEC PC-98 series] - * Copyright (c) 1995, 1996, 1997, 1998, 1999, 2000, 2001 - * NetBSD/pc98 porting staff. All rights reserved. - * Copyright (c) 1995, 1996, 1997, 1998, 1999, 2000, 2001 - * Naofumi HONDA. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef _CT_MACHDEP_H_ -#define _CT_MACHDEP_H_ - -#include "opt_ct.h" - -/* - * Principal rules: - * 1) do not use bus_space_write/read_X directly in ct.c. - * 2) do not use port offset defs directly in ct.c. - */ - -/* special weight if requried */ -#ifdef CT_BUS_WEIGHT -#undef CT_BUS_WEIGHT -#define CT_BUS_WEIGHT(chp) \ -{ \ - if ((chp)->ch_bus_weight != NULL) \ - (chp)->ch_bus_weight((chp)); \ -} -#else /* !CT_BUS_WEIGHT */ -#define CT_BUS_WEIGHT(chp) -#endif /* !CT_BUS_WEIGHT */ - -/* port offset */ -#ifndef CT_USE_RELOCATE_OFFSET -#define addr_port 0 -#define stat_port 0 -#define ctrl_port 2 -#define cmd_port 4 -#else /* CT_USE_RELOCATE_OFFSET */ -#define addr_port ((chp)->ch_offset[0]) -#define stat_port ((chp)->ch_offset[1]) -#define ctrl_port ((chp)->ch_offset[2]) -#define cmd_port ((chp)->ch_offset[3]) -#endif /* CT_USE_RELOCATE_OFFSET */ - -/* - * All port accesses primitive methods - */ -static __inline u_int8_t ct_stat_read_1 - (struct ct_bus_access_handle *); -static __inline u_int8_t ct_cmdp_read_1 - (struct ct_bus_access_handle *); -static __inline void ct_cmdp_write_1 - (struct ct_bus_access_handle *, u_int8_t); -static __inline u_int8_t ct_cr_read_1 - (struct ct_bus_access_handle *, bus_addr_t); -static __inline void ct_cr_write_1 - (struct ct_bus_access_handle *, bus_addr_t, u_int8_t); -static __inline void ct_write_cmds - (struct ct_bus_access_handle *, u_int8_t *, int); -static __inline u_int cthw_get_count - (struct ct_bus_access_handle *); -static __inline void cthw_set_count - (struct ct_bus_access_handle *, u_int); - -static __inline u_int8_t -ct_stat_read_1(struct ct_bus_access_handle *chp) -{ - u_int8_t regv; - - regv = bus_read_1(chp->ch_io, stat_port); - CT_BUS_WEIGHT(chp) - return regv; -} - -static __inline void -cthw_set_count(struct ct_bus_access_handle *chp, u_int count) -{ - - bus_write_1(chp->ch_io, addr_port, wd3s_cnt); - CT_BUS_WEIGHT(chp) - bus_write_1(chp->ch_io, ctrl_port, count >> 16); - CT_BUS_WEIGHT(chp) - bus_write_1(chp->ch_io, ctrl_port, count >> 8); - CT_BUS_WEIGHT(chp) - bus_write_1(chp->ch_io, ctrl_port, count); - CT_BUS_WEIGHT(chp) -} - -static __inline u_int -cthw_get_count(struct ct_bus_access_handle *chp) -{ - u_int count; - - bus_write_1(chp->ch_io, addr_port, wd3s_cnt); - CT_BUS_WEIGHT(chp) - count = (((u_int) bus_read_1(chp->ch_io, ctrl_port)) << 16); - CT_BUS_WEIGHT(chp) - count += (((u_int) bus_read_1(chp->ch_io, ctrl_port)) << 8); - CT_BUS_WEIGHT(chp) - count += ((u_int) bus_read_1(chp->ch_io, ctrl_port)); - CT_BUS_WEIGHT(chp) - return count; -} - -static __inline void -ct_write_cmds(struct ct_bus_access_handle *chp, u_int8_t *cmd, int len) -{ - int i; - - bus_write_1(chp->ch_io, addr_port, wd3s_cdb); - CT_BUS_WEIGHT(chp) - for (i = 0; i < len; i ++) - { - bus_write_1(chp->ch_io, ctrl_port, cmd[i]); - CT_BUS_WEIGHT(chp) - } -} - -static __inline u_int8_t -ct_cr_read_1(struct ct_bus_access_handle *chp, bus_addr_t offs) -{ - u_int8_t regv; - - bus_write_1(chp->ch_io, addr_port, offs); - CT_BUS_WEIGHT(chp) - regv = bus_read_1(chp->ch_io, ctrl_port); - CT_BUS_WEIGHT(chp) - return regv; -} - -static __inline void -ct_cr_write_1(struct ct_bus_access_handle *chp, bus_addr_t offs, u_int8_t val) -{ - - bus_write_1(chp->ch_io, addr_port, offs); - CT_BUS_WEIGHT(chp) - bus_write_1(chp->ch_io, ctrl_port, val); - CT_BUS_WEIGHT(chp) -} - -static __inline u_int8_t -ct_cmdp_read_1(struct ct_bus_access_handle *chp) -{ - u_int8_t regv; - - regv = bus_read_1(chp->ch_io, cmd_port); - CT_BUS_WEIGHT(chp) - return regv; -} - -static __inline void -ct_cmdp_write_1(struct ct_bus_access_handle *chp, u_int8_t val) -{ - - bus_write_1(chp->ch_io, cmd_port, val); - CT_BUS_WEIGHT(chp) -} - -#endif /* !_CT_MACHDEP_H_ */ diff --git a/sys/dev/ct/ctvar.h b/sys/dev/ct/ctvar.h deleted file mode 100644 index 10ce2d891200..000000000000 --- a/sys/dev/ct/ctvar.h +++ /dev/null @@ -1,129 +0,0 @@ -/* $FreeBSD$ */ -/* $NecBSD: ctvar.h,v 1.4.14.3 2001/06/20 06:13:34 honda Exp $ */ -/* $NetBSD$ */ - -/*- - * [NetBSD for NEC PC-98 series] - * Copyright (c) 1995, 1996, 1997, 1998, 1999, 2000, 2001 - * NetBSD/pc98 porting staff. All rights reserved. - * Copyright (c) 1995, 1996, 1997, 1998, 1999, 2000, 2001 - * Naofumi HONDA. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef _CTVAR_H_ -#define _CTVAR_H_ -/* - * ctvar.h - * Generic wd33c93 chip driver's definitions - */ - -/***************************************************************** - * Host adapter structure - *****************************************************************/ -struct ct_bus_access_handle { - struct resource *ch_io; /* core chip ctrl port */ - struct resource *ch_mem; /* data port (shm) */ - - void (*ch_bus_weight)(struct ct_bus_access_handle *); - -#ifdef CT_USE_RELOCATE_OFFSET - bus_addr_t ch_offset[4]; -#endif /* CT_USE_RELOCATE_OFFSET */ -}; - -struct ct_softc { - struct scsi_low_softc sc_sclow; /* generic data */ - - struct ct_bus_access_handle sc_ch; /* bus access handle */ - - struct resource *port_res; - struct resource *mem_res; - struct resource *irq_res; - struct resource *drq_res; - - bus_dma_tag_t sc_dmat; /* data DMA tag */ - bus_dmamap_t sc_dmamapt; /* data DMAMAP tag */ - - void *sc_ih; - - int sc_chiprev; /* chip version */ -#define CT_WD33C93 0x00000 -#define CT_WD33C93_A 0x10000 -#define CT_AM33C93_A 0x10001 -#define CT_WD33C93_B 0x20000 -#define CT_WD33C93_C 0x30000 - - int sc_xmode; -#define CT_XMODE_PIO 1 -#define CT_XMODE_DMA 2 - - int sc_dma; /* dma transfer start */ -#define CT_DMA_PIOSTART 1 -#define CT_DMA_DMASTART 2 - - int sc_satgo; /* combination cmd start */ -#define CT_SAT_GOING 1 - - int sc_tmaxcnt; - int sc_atten; /* attention */ - u_int8_t sc_creg; /* control register value */ - - int sc_chipclk; /* chipclk 0, 10, 15, 20 */ - struct ct_synch_data { - u_int cs_period; - u_int cs_syncr; - } *sc_sdp; /* synchronous data table pt */ - - struct ct_synch_data sc_default_sdt[16]; - - /* - * Machdep stuff. - */ - void *ct_hw; /* point to bshw_softc etc ... */ - int (*ct_dma_xfer_start)(struct ct_softc *); - int (*ct_pio_xfer_start)(struct ct_softc *); - void (*ct_dma_xfer_stop)(struct ct_softc *); - void (*ct_pio_xfer_stop)(struct ct_softc *); - void (*ct_bus_reset)(struct ct_softc *); - void (*ct_synch_setup)(struct ct_softc *, struct targ_info *); -}; - -/***************************************************************** - * Lun information - *****************************************************************/ -struct ct_targ_info { - struct targ_info cti_ti; - - u_int8_t cti_syncreg; -}; - -/***************************************************************** - * PROTO - *****************************************************************/ -int ctprobesubr(struct ct_bus_access_handle *, u_int, int, u_int, int *); -void ctattachsubr(struct ct_softc *); -void ctintr(void *); -#endif /* !_CTVAR_H_ */ diff --git a/sys/dev/cxgbe/tom/t4_connect.c b/sys/dev/cxgbe/tom/t4_connect.c index bd78c7fced61..ebd5766081c2 100644 --- a/sys/dev/cxgbe/tom/t4_connect.c +++ b/sys/dev/cxgbe/tom/t4_connect.c @@ -275,6 +275,14 @@ t4_init_connect_cpl_handlers(void) t4_register_cpl_handler(CPL_ACT_OPEN_RPL, do_act_open_rpl); } +void +t4_uninit_connect_cpl_handlers(void) +{ + + t4_register_cpl_handler(CPL_ACT_ESTABLISH, NULL); + t4_register_cpl_handler(CPL_ACT_OPEN_RPL, NULL); +} + #define DONT_OFFLOAD_ACTIVE_OPEN(x) do { \ reason = __LINE__; \ rc = (x); \ diff --git a/sys/dev/cxgbe/tom/t4_cpl_io.c b/sys/dev/cxgbe/tom/t4_cpl_io.c index 25ad1e355348..9742da01124c 100644 --- a/sys/dev/cxgbe/tom/t4_cpl_io.c +++ b/sys/dev/cxgbe/tom/t4_cpl_io.c @@ -1848,12 +1848,12 @@ void t4_uninit_cpl_io_handlers(void) { - t4_register_cpl_handler(CPL_PEER_CLOSE, do_peer_close); - t4_register_cpl_handler(CPL_CLOSE_CON_RPL, do_close_con_rpl); - t4_register_cpl_handler(CPL_ABORT_REQ_RSS, do_abort_req); - t4_register_cpl_handler(CPL_ABORT_RPL_RSS, do_abort_rpl); - t4_register_cpl_handler(CPL_RX_DATA, do_rx_data); - t4_register_cpl_handler(CPL_FW4_ACK, do_fw4_ack); + t4_register_cpl_handler(CPL_PEER_CLOSE, NULL); + t4_register_cpl_handler(CPL_CLOSE_CON_RPL, NULL); + t4_register_cpl_handler(CPL_ABORT_REQ_RSS, NULL); + t4_register_cpl_handler(CPL_ABORT_RPL_RSS, NULL); + t4_register_cpl_handler(CPL_RX_DATA, NULL); + t4_register_cpl_handler(CPL_FW4_ACK, NULL); } /* diff --git a/sys/dev/cxgbe/tom/t4_listen.c b/sys/dev/cxgbe/tom/t4_listen.c index 0368cef10d8f..f59d9a0930d9 100644 --- a/sys/dev/cxgbe/tom/t4_listen.c +++ b/sys/dev/cxgbe/tom/t4_listen.c @@ -1622,4 +1622,14 @@ t4_init_listen_cpl_handlers(void) t4_register_cpl_handler(CPL_PASS_ACCEPT_REQ, do_pass_accept_req); t4_register_cpl_handler(CPL_PASS_ESTABLISH, do_pass_establish); } + +void +t4_uninit_listen_cpl_handlers(void) +{ + + t4_register_cpl_handler(CPL_PASS_OPEN_RPL, NULL); + t4_register_cpl_handler(CPL_CLOSE_LISTSRV_RPL, NULL); + t4_register_cpl_handler(CPL_PASS_ACCEPT_REQ, NULL); + t4_register_cpl_handler(CPL_PASS_ESTABLISH, NULL); +} #endif diff --git a/sys/dev/cxgbe/tom/t4_tom.c b/sys/dev/cxgbe/tom/t4_tom.c index 1448aad009f8..11558c23bfa5 100644 --- a/sys/dev/cxgbe/tom/t4_tom.c +++ b/sys/dev/cxgbe/tom/t4_tom.c @@ -273,8 +273,6 @@ undo_offload_socket(struct socket *so) mtx_lock(&td->toep_list_lock); TAILQ_REMOVE(&td->toep_list, toep, link); mtx_unlock(&td->toep_list_lock); - - free_toepcb(toep); } static void @@ -1229,6 +1227,10 @@ t4_tom_mod_unload(void) t4_ddp_mod_unload(); + t4_uninit_connect_cpl_handlers(); + t4_uninit_listen_cpl_handlers(); + t4_uninit_cpl_io_handlers(); + return (0); } #endif /* TCP_OFFLOAD */ diff --git a/sys/dev/cxgbe/tom/t4_tom.h b/sys/dev/cxgbe/tom/t4_tom.h index 29d819252b4d..18bc1f291c55 100644 --- a/sys/dev/cxgbe/tom/t4_tom.h +++ b/sys/dev/cxgbe/tom/t4_tom.h @@ -326,12 +326,14 @@ void release_lip(struct tom_data *, struct clip_entry *); /* t4_connect.c */ void t4_init_connect_cpl_handlers(void); +void t4_uninit_connect_cpl_handlers(void); int t4_connect(struct toedev *, struct socket *, struct rtentry *, struct sockaddr *); void act_open_failure_cleanup(struct adapter *, u_int, u_int); /* t4_listen.c */ void t4_init_listen_cpl_handlers(void); +void t4_uninit_listen_cpl_handlers(void); int t4_listen_start(struct toedev *, struct tcpcb *); int t4_listen_stop(struct toedev *, struct tcpcb *); void t4_syncache_added(struct toedev *, void *); diff --git a/sys/dev/ed/if_ed98.h b/sys/dev/ed/if_ed98.h deleted file mode 100644 index b16054960b31..000000000000 --- a/sys/dev/ed/if_ed98.h +++ /dev/null @@ -1,108 +0,0 @@ -/*- - * Copyright (c) KATO Takenori, 1996. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer as - * the first lines of this file unmodified. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD$ - */ - -/* - * PC-9801 specific definitions for DP8390/SMC8216 NICs. - */ - -/* - * Vendor types - */ -#define ED_VENDOR_MISC 0xf0 /* others */ - -/* - * Card types. - * - * Type Card - * 0x00 Allied Telesis CenterCom LA-98-T / SMC EtherEZ98. - * 0x10 ** RESERVED ** - * 0x20 PLANET SMART COM 98 EN-2298 / ELECOM LANEED LD-BDN[123]A. - * 0x30 MELCO EGY-98 / Contec C-NET(98)E-A/L-A. - * 0x40 MELCO LGY-98, IND-SP, IND-SS / MACNICA NE2098(XXX). - * 0x50 ICM DT-ET-25, DT-ET-T5, IF-2766ET, IF-2771ET / - * D-Link DE-298P{T,CAT}, DE-298{T,TP,CAT}. - * 0x60 Allied Telesis SIC-98. - * 0x70 ** RESERVED ** - * 0x80 NEC PC-9801-108. - * 0x90 IO-DATA LA-98 / NEC PC-9801-77. - * 0xa0 Contec C-NET(98). - * 0xb0 Contec C-NET(98)E/L. - * 0xc0 ** RESERVED ** - * 0xd0 Networld EC/EP-98X. - * 0xe0 Soliton SB-9801 / Fujikura FN-9801 / Networld EC/EP-98S. - * 0xf0 NextCom NC5098. - */ -#define ED_TYPE98_BASE 0x80 - -#define ED_TYPE98_GENERIC 0x80 -#define ED_TYPE98_BDN 0x82 -#define ED_TYPE98_EGY 0x83 -#define ED_TYPE98_LGY 0x84 -#define ED_TYPE98_ICM 0x85 -#define ED_TYPE98_SIC 0x86 -#define ED_TYPE98_108 0x88 -#define ED_TYPE98_LA98 0x89 -#define ED_TYPE98_CNET98 0x8a -#define ED_TYPE98_CNET98EL 0x8b -#define ED_TYPE98_NW98X 0x8d -#define ED_TYPE98_SB98 0x8e -#define ED_TYPE98_NC5098 0x8f - -#define ED_TYPE98(x) (((x & 0xffff0000) >> 20) | ED_TYPE98_BASE) -#define ED_TYPE98SUB(x) ((x & 0xf0000) >> 16) - -/* - * Definitions for C-NET(98) serise - */ -/* - * Initial Register(on board JP1) - */ -#define ED_CNET98_INIT 0xaaed /* default */ -#define ED_CNET98_INIT2 0x55ed /* another setting */ - -#define ED_CNET98EL_PAGE_OFFSET 0x0000 /* Page offset for NIC access to mem */ - -/* - * Definitions for Soliton SB-9801 - */ -/* - * I/O port select register - */ -#define ED_SB98_IO_INHIBIT 0x0040 /* XXX - shares printer port! */ - -/* - * Definitions for SMC EtherEZ98(SMC8498BTA) - */ -#define ED_EZ98_NIC_OFFSET 0x100 /* I/O base offset to NIC */ -#define ED_EZ98_ASIC_OFFSET 0 /* I/O base offset to ASIC */ -/* - * XXX - The I/O address range is fragmented in the EtherEZ98; - * it occupies 16*2 I/O addresses, by the way. - */ -#define ED_EZ98_IO_PORTS 16 /* # of i/o addresses used */ diff --git a/sys/dev/ed/if_ed_cbus.c b/sys/dev/ed/if_ed_cbus.c deleted file mode 100644 index 7926fa8e2389..000000000000 --- a/sys/dev/ed/if_ed_cbus.c +++ /dev/null @@ -1,1629 +0,0 @@ -/*- - * Copyright (c) 1995, David Greenman - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice unmodified, this list of conditions, and the following - * disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * $FreeBSD$ - */ - -#include <sys/param.h> -#include <sys/systm.h> -#include <sys/socket.h> -#include <sys/kernel.h> - -#include <sys/module.h> -#include <sys/bus.h> -#include <machine/bus.h> -#include <sys/rman.h> -#include <machine/resource.h> - -#include <net/ethernet.h> -#include <net/if.h> -#include <net/if_arp.h> -#include <net/if_media.h> -#include <net/if_mib.h> - -#include <isa/isavar.h> - -#include <dev/ed/if_edvar.h> -#include <dev/ed/if_edreg.h> -#include <dev/ed/if_ed98.h> - -static int ed98_alloc_port(device_t, int); -static int ed98_alloc_memory(device_t, int); -static int ed_pio_testmem(struct ed_softc *, int, int, int); -static int ed_probe_CNET98(device_t, int, int); -static int ed_probe_CNET98EL(device_t, int, int); -static int ed_probe_EZ98(device_t, int, int); -static int ed_probe_NEC77(device_t, int, int); -static int ed_probe_NW98X(device_t, int, int); -static int ed_probe_SB98(device_t, int, int); -static int ed_probe_SIC98(device_t, int, int); -static int ed98_probe_Novell(device_t, int, int); -static int ed98_probe_generic8390(struct ed_softc *); -static void ed_reset_CNET98(struct ed_softc *, int); -static void ed_winsel_CNET98(struct ed_softc *, u_short); -static void ed_get_SB98(struct ed_softc *); - -static int ed_cbus_probe(device_t); -static int ed_cbus_attach(device_t); - -static struct isa_pnp_id ed_ids[] = { -/* TODO - list up PnP boards for PC-98 */ - { 0, NULL } -}; - -static int -ed_cbus_probe(device_t dev) -{ - struct ed_softc *sc = device_get_softc(dev); - int flags = device_get_flags(dev); - int error = 0; - - sc->type = ED_TYPE98(flags); -#ifdef ED_DEBUG - device_printf(dev, "ed_cbus_probe: sc->type=%x\n", sc->type); -#endif - - /* Check isapnp ids */ - error = ISA_PNP_PROBE(device_get_parent(dev), dev, ed_ids); -#ifdef ED_DEBUG - device_printf(dev, "ed_cbus_probe: ISA_PNP_PROBE returns %d\n", error); -#endif - - /* If the card had a PnP ID that didn't match any we know about */ - if (error == ENXIO) - goto end; - - /* If we had some other problem. */ - if (!(error == 0 || error == ENOENT)) - goto end; - - /* Heuristic probes */ -#ifdef ED_DEBUG - device_printf(dev, "ed_cbus_probe: Heuristic probes start\n"); -#endif - switch (sc->type) { - case ED_TYPE98_GENERIC: - /* - * CAUTION! - * sc->type of these boards are overwritten by PC/AT's value. - */ - - /* - * SMC EtherEZ98 - */ - error = ed_probe_EZ98(dev, 0, flags); - if (error == 0) - goto end; - - ed_release_resources(dev); - - /* - * Allied Telesis CenterCom LA-98-T - */ - error = ed_probe_Novell(dev, 0, flags); - if (error == 0) { - ed_Novell_read_mac(sc); - goto end; - } - break; - - /* - * NE2000-like boards probe routine - */ - case ED_TYPE98_BDN: - /* - * ELECOM LANEED LD-BDN - * PLANET SMART COM 98 EN-2298 - */ - case ED_TYPE98_LGY: - /* - * MELCO LGY-98, IND-SP, IND-SS - * MACNICA NE2098 - */ - case ED_TYPE98_ICM: - /* - * ICM DT-ET-25, DT-ET-T5, IF-2766ET, IF-2771ET - * D-Link DE-298P, DE-298 - */ - case ED_TYPE98_EGY: - /* - * MELCO EGY-98 - * Contec C-NET(98)E-A, C-NET(98)L-A - */ - case ED_TYPE98_108: - /* - * NEC PC-9801-107,108 - */ - case ED_TYPE98_NC5098: - /* - * NextCom NC5098 - */ - error = ed98_probe_Novell(dev, 0, flags); - break; - - /* - * other boards with special probe routine - */ - case ED_TYPE98_SIC: - /* - * Allied Telesis SIC-98 - */ - error = ed_probe_SIC98(dev, 0, flags); - break; - - case ED_TYPE98_CNET98EL: - /* - * Contec C-NET(98)E/L - */ - error = ed_probe_CNET98EL(dev, 0, flags); - break; - - case ED_TYPE98_CNET98: - /* - * Contec C-NET(98) - */ - error = ed_probe_CNET98(dev, 0, flags); - break; - - case ED_TYPE98_LA98: - /* - * IO-DATA LA/T-98 - * NEC PC-9801-77,78 - */ - error = ed_probe_NEC77(dev, 0, flags); - break; - - case ED_TYPE98_NW98X: - /* - * Networld EC/EP-98X - */ - error = ed_probe_NW98X(dev, 0, flags); - break; - - case ED_TYPE98_SB98: - /* - * Soliton SB-9801 - * Fujikura FN-9801 - */ - error = ed_probe_SB98(dev, 0, flags); - break; - } - -end: -#ifdef ED_DEBUG - device_printf(dev, "ed_cbus_probe: end, error=%d\n", error); -#endif - if (error == 0) - error = ed_alloc_irq(dev, 0, 0); - - ed_release_resources(dev); - return (error); -} - -static int -ed_cbus_attach(dev) - device_t dev; -{ - struct ed_softc *sc = device_get_softc(dev); - int flags = device_get_flags(dev); - int error; - - if (sc->port_used > 0) { - if (ED_TYPE98(flags) == ED_TYPE98_GENERIC) - ed_alloc_port(dev, 0, sc->port_used); - else - ed98_alloc_port(dev, 0); - } - if (sc->mem_used) - ed_alloc_memory(dev, 0, sc->mem_used); - - ed_alloc_irq(dev, 0, 0); - - if (sc->sc_media_ioctl == NULL) - ed_gen_ifmedia_init(sc); - error = ed_attach(dev); - if (error) { - ed_release_resources(dev); - return (error); - } - error = bus_setup_intr(dev, sc->irq_res, INTR_TYPE_NET | INTR_MPSAFE, - NULL, edintr, sc, &sc->irq_handle); - if (error) - ed_release_resources(dev); - return (error); -} - -/* - * Interrupt conversion table for EtherEZ98 - */ -static uint16_t ed_EZ98_intr_val[] = { - 0, - 3, - 5, - 6, - 0, - 9, - 12, - 13 -}; - -static int -ed_probe_EZ98(device_t dev, int port_rid, int flags) -{ - struct ed_softc *sc = device_get_softc(dev); - int error; - static unsigned short *intr_vals[] = {NULL, ed_EZ98_intr_val}; - - error = ed_alloc_port(dev, port_rid, ED_EZ98_IO_PORTS); - if (error) { - return (error); - } - - sc->asic_offset = ED_EZ98_ASIC_OFFSET; - sc->nic_offset = ED_EZ98_NIC_OFFSET; - - return ed_probe_WD80x3_generic(dev, flags, intr_vals); -} - -/* - * I/O conversion tables - */ - -/* LGY-98, ICM, C-NET(98)E/L */ -static bus_addr_t ed98_ioaddr_generic[] = { - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 -}; - -/* - * Definitions for Contec C-NET(98)E/L - */ -#define ED_CNET98EL_ICR 2 /* Interrupt Configuration Register */ - -#define ED_CNET98EL_ICR_IRQ3 0x01 -#define ED_CNET98EL_ICR_IRQ5 0x02 -#define ED_CNET98EL_ICR_IRQ6 0x04 -#define ED_CNET98EL_ICR_IRQ12 0x20 - -#define ED_CNET98EL_IMR 4 /* Interrupt Mask Register */ -#define ED_CNET98EL_ISR 5 /* Interrupt Status Register */ - -/* EGY-98 */ -static bus_addr_t ed98_ioaddr_egy98[] = { - 0, 0x02, 0x04, 0x06, 0x08, 0x0a, 0x0c, 0x0e, - 0x100, 0x102, 0x104, 0x106, 0x108, 0x10a, 0x10c, 0x10e -}; - -/* SIC-98 */ -static bus_addr_t ed98_ioaddr_sic98[] = { - 0x0000, 0x0200, 0x0400, 0x0600, 0x0800, 0x0a00, 0x0c00, 0x0e00, - 0x1000, 0x1200, 0x1400, 0x1600, 0x1800, 0x1a00, 0x1c00, 0x1e00 -}; - -/* LA/T-98, LD-BDN, PC-9801-77, SB-9801 */ -static bus_addr_t ed98_ioaddr_la98[] = { - 0x0000, 0x1000, 0x2000, 0x3000, 0x4000, 0x5000, 0x6000, 0x7000, - 0x8000, 0x9000, 0xa000, 0xb000, 0xc000, 0xd000, 0xe000, 0xf000, - 0x0100 /* for NEC 77(see below) */ -}; - -/* - * Definitions for NEC PC-9801-77 - */ -#define ED_NEC77_IRQ 16 /* Interrupt Configuration Register */ - -#define ED_NEC77_IRQ3 0x04 -#define ED_NEC77_IRQ5 0x06 -#define ED_NEC77_IRQ6 0x08 -#define ED_NEC77_IRQ12 0x0a -#define ED_NEC77_IRQ13 0x02 - -/* - * Definitions for Soliton SB-9801 - */ -#define ED_SB98_CFG 1 /* Board configuration */ - -#define ED_SB98_CFG_IRQ3 0x00 -#define ED_SB98_CFG_IRQ5 0x04 -#define ED_SB98_CFG_IRQ6 0x08 -#define ED_SB98_CFG_IRQ12 0x0c -#define ED_SB98_CFG_ALTPORT 0x40 /* use EXTERNAL media */ -#define ED_SB98_CFG_ENABLE 0xa0 /* enable configuration */ - -#define ED_SB98_EEPENA 2 /* EEPROM access enable */ - -#define ED_SB98_EEPENA_DISABLE 0x00 -#define ED_SB98_EEPENA_ENABLE 0x01 - -#define ED_SB98_EEP 3 /* EEPROM access */ - -#define ED_SB98_EEP_SDA 0x01 /* Serial Data */ -#define ED_SB98_EEP_SCL 0x02 /* Serial Clock */ -#define ED_SB98_EEP_READ 0x01 /* Read Command */ - -#define ED_SB98_EEP_DELAY 300 - -#define ED_SB98_ADDRESS 0x01 /* Station Address(1-6) */ - -#define ED_SB98_POLARITY 4 /* Polarity */ - -/* PC-9801-108 */ -static bus_addr_t ed98_ioaddr_nec108[] = { - 0x0000, 0x0002, 0x0004, 0x0006, 0x0008, 0x000a, 0x000c, 0x000e, - 0x1000, 0x1002, 0x1004, 0x1006, 0x1008, 0x100a, 0x100c, 0x100e -}; - -/* C-NET(98) */ -static bus_addr_t ed98_ioaddr_cnet98[] = { - 0x0000, 0x0002, 0x0004, 0x0006, 0x0008, 0x000a, 0x000c, 0x000e, - 0x0400, 0x0402, 0x0404, 0x0406, 0x0408, 0x040a, 0x040c, 0x040e -}; - -/* - * Definitions for Contec C-NET(98) - */ -#define ED_CNET98_MAP_REG0L 0 /* MAPPING register0 Low */ -#define ED_CNET98_MAP_REG1L 1 /* MAPPING register1 Low */ -#define ED_CNET98_MAP_REG2L 2 /* MAPPING register2 Low */ -#define ED_CNET98_MAP_REG3L 3 /* MAPPING register3 Low */ -#define ED_CNET98_MAP_REG0H 4 /* MAPPING register0 Hi */ -#define ED_CNET98_MAP_REG1H 5 /* MAPPING register1 Hi */ -#define ED_CNET98_MAP_REG2H 6 /* MAPPING register2 Hi */ -#define ED_CNET98_MAP_REG3H 7 /* MAPPING register3 Hi */ -#define ED_CNET98_WIN_REG 8 /* Window register */ -#define ED_CNET98_INT_LEV 9 /* Init level register */ - -#define ED_CNET98_INT_IRQ3 0x01 /* INT 0 */ -#define ED_CNET98_INT_IRQ5 0x02 /* INT 1 */ -#define ED_CNET98_INT_IRQ6 0x04 /* INT 2 */ -#define ED_CNET98_INT_IRQ9 0x08 /* INT 3 */ -#define ED_CNET98_INT_IRQ12 0x20 /* INT 5 */ -#define ED_CNET98_INT_IRQ13 0x40 /* INT 6 */ - -#define ED_CNET98_INT_REQ 10 /* Init request register */ -#define ED_CNET98_INT_MASK 11 /* Init mask register */ -#define ED_CNET98_INT_STAT 12 /* Init status register */ -#define ED_CNET98_INT_CLR 12 /* Init clear register */ -#define ED_CNET98_RESERVE1 13 -#define ED_CNET98_RESERVE2 14 -#define ED_CNET98_RESERVE3 15 - -/* EC/EP-98X, NC5098 */ -static bus_addr_t ed98_ioaddr_nw98x[] = { - 0x0000, 0x0100, 0x0200, 0x0300, 0x0400, 0x0500, 0x0600, 0x0700, - 0x0800, 0x0900, 0x0a00, 0x0b00, 0x0c00, 0x0d00, 0x0e00, 0x0f00, - 0x1000 /* for EC/EP-98X(see below) */ -}; - -/* - * Definitions for Networld EC/EP-98X - */ -#define ED_NW98X_IRQ 16 /* Interrupt Configuration Register */ - -#define ED_NW98X_IRQ3 0x04 -#define ED_NW98X_IRQ5 0x06 -#define ED_NW98X_IRQ6 0x08 -#define ED_NW98X_IRQ12 0x0a -#define ED_NW98X_IRQ13 0x02 - -/* NC5098 ASIC */ -static bus_addr_t ed98_asic_nc5098[] = { -/* DATA ENADDR RESET */ - 0x0000, 0x2000, 0x2100, 0x2200, 0x2300, 0x2400, 0x2500, 0x4000, - 0, 0, 0, 0, 0, 0, 0, 0 -}; - -/* - * Definitions for NextCom NC5098 - */ -#define ED_NC5098_ENADDR 1 /* Station Address(1-6) */ - -/* - * Allocate a port resource with the given resource id. - */ -static int -ed98_alloc_port(device_t dev, int rid) -{ - struct ed_softc *sc = device_get_softc(dev); - struct resource *res; - int error; - bus_addr_t *io_nic, *io_asic, adj; - static bus_addr_t io_res[ED_NOVELL_IO_PORTS + 1]; - int i, n; - int offset, reset, data; - - /* Set i/o table for resource manager */ - io_nic = io_asic = ed98_ioaddr_generic; - offset = ED_NOVELL_ASIC_OFFSET; - reset = ED_NOVELL_RESET; - data = ED_NOVELL_DATA; - n = ED_NOVELL_IO_PORTS; - - switch (sc->type) { - case ED_TYPE98_LGY: - io_asic = ed98_ioaddr_egy98; /* XXX - Yes, we use egy98 */ - offset = 0x0200; - reset = 8; - break; - - case ED_TYPE98_EGY: - io_nic = io_asic = ed98_ioaddr_egy98; - offset = 0x0200; - reset = 8; - break; - - case ED_TYPE98_ICM: - offset = 0x0100; - break; - - case ED_TYPE98_BDN: - io_nic = io_asic = ed98_ioaddr_la98; - offset = 0x0100; - reset = 0x0c; - break; - - case ED_TYPE98_SIC: - io_nic = io_asic = ed98_ioaddr_sic98; - offset = 0x2000; - n = 16+1; - break; - - case ED_TYPE98_108: - io_nic = io_asic = ed98_ioaddr_nec108; - offset = 0x0888; /* XXX - overwritten after */ - reset = 1; - n = 16; /* XXX - does not set ASIC i/o here */ - break; - - case ED_TYPE98_LA98: - io_nic = io_asic = ed98_ioaddr_la98; - offset = 0x0100; - break; - - case ED_TYPE98_CNET98EL: - offset = 0x0400; - data = 0x0e; - break; - - case ED_TYPE98_CNET98: - /* XXX - Yes, we use generic i/o here */ - offset = 0x0400; - break; - - case ED_TYPE98_NW98X: - io_nic = io_asic = ed98_ioaddr_nw98x; - offset = 0x1000; - break; - - case ED_TYPE98_SB98: - io_nic = io_asic = ed98_ioaddr_la98; - offset = 0x0400; - reset = 7; - break; - - case ED_TYPE98_NC5098: - io_nic = ed98_ioaddr_nw98x; - io_asic = ed98_asic_nc5098; - offset = 0x2000; - reset = 7; - n = 16+8; /* XXX */ - break; - } - - bcopy(io_nic, io_res, sizeof(io_nic[0]) * ED_NOVELL_ASIC_OFFSET); - for (i = ED_NOVELL_ASIC_OFFSET; i < ED_NOVELL_IO_PORTS; i++) - io_res[i] = io_asic[i - ED_NOVELL_ASIC_OFFSET] + offset; - - res = isa_alloc_resourcev(dev, SYS_RES_IOPORT, &rid, io_res, n, - RF_ACTIVE); - if (!res) - return (ENOENT); - - sc->port_res = res; - sc->port_used = n; - sc->port_bst = rman_get_bustag(res); - sc->port_bsh = rman_get_bushandle(res); - - /* Re-map i/o table if needed */ - switch (sc->type) { - case ED_TYPE98_LA98: - case ED_TYPE98_NW98X: - io_res[n] = io_asic[n - ED_NOVELL_ASIC_OFFSET] + offset; - n++; - break; - - case ED_TYPE98_108: - adj = (rman_get_start(res) & 0xf000) / 2; - offset = (offset | adj) - rman_get_start(res); - - for (n = ED_NOVELL_ASIC_OFFSET; n < ED_NOVELL_IO_PORTS; n++) - io_res[n] = io_asic[n - ED_NOVELL_ASIC_OFFSET] + offset; - break; - - case ED_TYPE98_CNET98: - io_nic = io_asic = ed98_ioaddr_cnet98; - offset = 1; - - bcopy(io_nic, io_res, sizeof(io_nic[0]) * ED_NOVELL_ASIC_OFFSET); - for (n = ED_NOVELL_ASIC_OFFSET; n < ED_NOVELL_IO_PORTS; n++) - io_res[n] = io_asic[n - ED_NOVELL_ASIC_OFFSET] + offset; - break; - - case ED_TYPE98_NC5098: - n = ED_NOVELL_IO_PORTS; - break; - } - - if (reset != ED_NOVELL_RESET) - io_res[ED_NOVELL_ASIC_OFFSET + ED_NOVELL_RESET] = - io_res[ED_NOVELL_ASIC_OFFSET + reset]; - if (data != ED_NOVELL_DATA) { - io_res[ED_NOVELL_ASIC_OFFSET + ED_NOVELL_DATA] = - io_res[ED_NOVELL_ASIC_OFFSET + data]; -#if 0 - io_res[ED_NOVELL_ASIC_OFFSET + ED_NOVELL_DATA + 1] = - io_res[ED_NOVELL_ASIC_OFFSET + data + 1]; -#endif - } - - error = isa_load_resourcev(res, io_res, n); - if (error != 0) - return (ENOENT); -#ifdef ED_DEBUG - device_printf(dev, "ed98_alloc_port: i/o ports = %d\n", n); - for (i = 0; i < n; i++) - printf("%x,", io_res[i]); - printf("\n"); -#endif - return (0); -} - -static int -ed98_alloc_memory(dev, rid) - device_t dev; - int rid; -{ - struct ed_softc *sc = device_get_softc(dev); - int error; - rman_res_t conf_maddr, conf_msize; - - error = bus_get_resource(dev, SYS_RES_MEMORY, 0, &conf_maddr, - &conf_msize); - if (error) - return (error); - - if ((conf_maddr == 0) || (conf_msize == 0)) - return (ENXIO); - - error = ed_alloc_memory(dev, rid, (int) conf_msize); - if (error) - return (error); - - sc->mem_start = 0; - sc->mem_size = conf_msize; - - return (0); -} - -/* - * Generic probe routine for testing for the existance of a DS8390. - * Must be called after the NIC has just been reset. This routine - * works by looking at certain register values that are guaranteed - * to be initialized a certain way after power-up or reset. Seems - * not to currently work on the 83C690. - * - * Specifically: - * - * Register reset bits set bits - * Command Register (CR) TXP, STA RD2, STP - * Interrupt Status (ISR) RST - * Interrupt Mask (IMR) All bits - * Data Control (DCR) LAS - * Transmit Config. (TCR) LB1, LB0 - * - * XXX - We only check the CR register. - * - * Return 1 if 8390 was found, 0 if not. - */ - -static int -ed98_probe_generic8390(struct ed_softc *sc) -{ - u_char tmp = ed_nic_inb(sc, ED_P0_CR); -#ifdef DIAGNOSTIC - printf("ed?: inb(ED_P0_CR)=%x\n", tmp); -#endif - if ((tmp & (ED_CR_RD2 | ED_CR_TXP | ED_CR_STA | ED_CR_STP)) != - (ED_CR_RD2 | ED_CR_STP)) - return (0); - - (void) ed_nic_inb(sc, ED_P0_ISR); - - return (1); -} - -static int -ed98_probe_Novell(device_t dev, int port_rid, int flags) -{ - struct ed_softc *sc = device_get_softc(dev); - int error; - int n; - u_char romdata[ETHER_ADDR_LEN * 2], tmp; - -#ifdef ED_DEBUG - device_printf(dev, "ed98_probe_Novell: start\n"); -#endif - error = ed98_alloc_port(dev, port_rid); - if (error) - return (error); - - sc->asic_offset = ED_NOVELL_ASIC_OFFSET; - sc->nic_offset = ED_NOVELL_NIC_OFFSET; - - /* Reset the board */ -#ifdef ED_DEBUG - device_printf(dev, "ed98_probe_Novell: reset\n"); -#endif - switch (sc->type) { -#if 1 /* XXX - I'm not sure this is really necessary... */ - case ED_TYPE98_BDN: - tmp = ed_asic_inb(sc, ED_NOVELL_RESET); - ed_asic_outb(sc, ED_NOVELL_RESET, (tmp & 0xf0) | 0x08); - ed_nic_outb(sc, 0x04, tmp); - (void) ed_asic_inb(sc, 0x08); - ed_asic_outb(sc, 0x08, tmp); - ed_asic_outb(sc, 0x08, tmp & 0x7f); - break; -#endif - case ED_TYPE98_NC5098: - ed_asic_outb(sc, ED_NOVELL_RESET, 0x00); - DELAY(5000); - ed_asic_outb(sc, ED_NOVELL_RESET, 0x01); - break; - - default: - tmp = ed_asic_inb(sc, ED_NOVELL_RESET); - - /* - * I don't know if this is necessary; probably cruft leftover from - * Clarkson packet driver code. Doesn't do a thing on the boards I've - * tested. -DG [note that an outb(0x84, 0) seems to work here, and is - * non-invasive...but some boards don't seem to reset and I don't have - * complete documentation on what the 'right' thing to do is...so we - * do the invasive thing for now. Yuck.] - */ - ed_asic_outb(sc, ED_NOVELL_RESET, tmp); - break; - } - DELAY(5000); - - /* - * This is needed because some NE clones apparently don't reset the - * NIC properly (or the NIC chip doesn't reset fully on power-up) XXX - * - this makes the probe invasive! ...Done against my better - * judgement. -DLG - */ - ed_nic_outb(sc, ED_P0_CR, ED_CR_RD2 | ED_CR_STP); - DELAY(5000); - - /* Make sure that we really have an 8390 based board */ - if (!ed98_probe_generic8390(sc)) - return (ENXIO); - - /* Test memory via PIO */ -#ifdef ED_DEBUG - device_printf(dev, "ed98_probe_Novell: test memory\n"); -#endif - sc->cr_proto = ED_CR_RD2; - if (!ed_pio_testmem(sc, 8192, 0, flags) && - !ed_pio_testmem(sc, 16384, 1, flags)) - return (ENXIO); - - /* Setup the board type */ -#ifdef ED_DEBUG - device_printf(dev, "ed98_probe_Novell: board type\n"); -#endif - switch (sc->type) { - case ED_TYPE98_BDN: - sc->type_str = "LD-BDN"; - break; - case ED_TYPE98_EGY: - sc->type_str = "EGY-98"; - break; - case ED_TYPE98_LGY: - sc->type_str = "LGY-98"; - break; - case ED_TYPE98_ICM: - sc->type_str = "ICM"; - break; - case ED_TYPE98_108: - sc->type_str = "PC-9801-108"; - break; - case ED_TYPE98_LA98: - sc->type_str = "LA-98"; - break; - case ED_TYPE98_NW98X: - sc->type_str = "NW98X"; - break; - case ED_TYPE98_NC5098: - sc->type_str = "NC5098"; - break; - default: - sc->type_str = NULL; - break; - } - - /* Get station address */ - switch (sc->type) { - case ED_TYPE98_NC5098: - for (n = 0; n < ETHER_ADDR_LEN; n++) - sc->enaddr[n] = ed_asic_inb(sc, ED_NC5098_ENADDR + n); - break; - - default: - ed_pio_readmem(sc, 0, romdata, sizeof(romdata)); - for (n = 0; n < ETHER_ADDR_LEN; n++) - sc->enaddr[n] = romdata[n * (sc->isa16bit + 1)]; - break; - } - - /* clear any pending interrupts that might have occurred above */ - ed_nic_outb(sc, ED_P0_ISR, 0xff); - - sc->sc_write_mbufs = ed_pio_write_mbufs; - return (0); -} - -/* - * Probe and vendor-specific initialization routine for SIC-98 boards - */ -static int -ed_probe_SIC98(device_t dev, int port_rid, int flags) -{ - struct ed_softc *sc = device_get_softc(dev); - int error; - int i; - u_char sum; - - /* - * Setup card RAM and I/O address - * Kernel Virtual to segment C0000-DFFFF???? - */ - error = ed98_alloc_port(dev, port_rid); - if (error) - return (error); - - sc->asic_offset = ED_SIC_ASIC_OFFSET; - sc->nic_offset = ED_SIC_NIC_OFFSET; - - error = ed98_alloc_memory(dev, 0); - if (error) - return (error); - - /* Reset card to force it into a known state. */ - ed_asic_outb(sc, 0, 0x00); - DELAY(100); - if (ED_TYPE98SUB(flags) == 0) { - /* SIC-98/SIU-98 */ - ed_asic_outb(sc, 0, 0x94); - DELAY(100); - ed_asic_outb(sc, 0, 0x94); - } else { - /* SIU-98-D */ - ed_asic_outb(sc, 0, 0x80); - DELAY(100); - ed_asic_outb(sc, 0, 0x94); - DELAY(100); - ed_asic_outb(sc, 0, 0x9e); - } - DELAY(100); - - /* - * Here we check the card ROM, if the checksum passes, and the - * type code and ethernet address check out, then we know we have - * an SIC card. - */ - sum = bus_space_read_1(sc->mem_bst, sc->mem_bsh, 6 * 2); - for (i = 0; i < ETHER_ADDR_LEN; i++) - sum ^= (sc->enaddr[i] = - bus_space_read_1(sc->mem_bst, sc->mem_bsh, i * 2)); -#ifdef ED_DEBUG - device_printf(dev, "ed_probe_sic98: got address %6D\n", - sc->enaddr, ":"); -#endif - if (sum != 0) - return (ENXIO); - if ((sc->enaddr[0] | sc->enaddr[1] | sc->enaddr[2]) == 0) - return (ENXIO); - - sc->vendor = ED_VENDOR_SIC; - sc->type_str = "SIC98"; - sc->isa16bit = 1; - sc->cr_proto = 0; - - /* - * SIC RAM page 0x0000-0x3fff(or 0x7fff) - */ - if (ED_TYPE98SUB(flags) == 0) - ed_asic_outb(sc, 0, 0x90); - else - ed_asic_outb(sc, 0, 0x8e); - DELAY(100); - - error = ed_clear_memory(dev); - if (error) - return (error); - - sc->mem_shared = 1; - sc->mem_end = sc->mem_start + sc->mem_size; - - /* - * allocate one xmit buffer if < 16k, two buffers otherwise - */ - if ((sc->mem_size < 16384) || (flags & ED_FLAGS_NO_MULTI_BUFFERING)) - sc->txb_cnt = 1; - else - sc->txb_cnt = 2; - sc->tx_page_start = 0; - - sc->rec_page_start = sc->tx_page_start + ED_TXBUF_SIZE * sc->txb_cnt; - sc->rec_page_stop = sc->tx_page_start + sc->mem_size / ED_PAGE_SIZE; - - sc->mem_ring = sc->mem_start + sc->txb_cnt * ED_PAGE_SIZE * ED_TXBUF_SIZE; - - sc->sc_write_mbufs = ed_shmem_write_mbufs; - return (0); -} - -/* - * Contec C-NET(98) series support routines - */ -static void -ed_reset_CNET98(struct ed_softc *sc, int flags) -{ - u_int init_addr = ED_CNET98_INIT; - u_char tmp; - - /* Choose initial register address */ - if (ED_TYPE98SUB(flags) != 0) { - init_addr = ED_CNET98_INIT2; - } -#ifdef ED_DEBUG - printf("ed?: initial register=%x\n", init_addr); -#endif - /* - * Reset the board to force it into a known state. - */ - outb(init_addr, 0x00); /* request */ - DELAY(5000); - outb(init_addr, 0x01); /* cancel */ - DELAY(5000); - - /* - * Set I/O address(A15-12) and cpu type - * - * AAAAIXXC(8bit) - * AAAA: A15-A12, I: I/O enable, XX: reserved, C: CPU type - * - * CPU type is 1:80286 or higher, 0:not. - * But FreeBSD runs under i386 or higher, thus it must be 1. - */ - tmp = (rman_get_start(sc->port_res) & 0xf000) >> 8; - tmp |= (0x08 | 0x01); -#ifdef ED_DEBUG - printf("ed?: outb(%x, %x)\n", init_addr + 2, tmp); -#endif - outb(init_addr + 2, tmp); - DELAY(5000); - - /* - * This is needed because some NE clones apparently don't reset the - * NIC properly (or the NIC chip doesn't reset fully on power-up) XXX - * - this makes the probe invasive! ...Done against my better - * judgement. -DLG - */ - ed_nic_outb(sc, ED_P0_CR, ED_CR_RD2 | ED_CR_STP); - DELAY(5000); -} - -static void -ed_winsel_CNET98(struct ed_softc *sc, u_short bank) -{ - u_char mem = (rman_get_start(sc->mem_res) >> 12) & 0xff; - - /* - * Disable window memory - * bit7 is 0:disable - */ - ed_asic_outb(sc, ED_CNET98_WIN_REG, mem & 0x7f); - DELAY(10); - - /* - * Select window address - * FreeBSD address 0xf00xxxxx - */ - ed_asic_outb(sc, ED_CNET98_MAP_REG0L, bank & 0xff); - DELAY(10); - ed_asic_outb(sc, ED_CNET98_MAP_REG0H, (bank >> 8) & 0xff); - DELAY(10); - ed_asic_outb(sc, ED_CNET98_MAP_REG1L, 0x00); - DELAY(10); - ed_asic_outb(sc, ED_CNET98_MAP_REG1H, 0x41); - DELAY(10); - ed_asic_outb(sc, ED_CNET98_MAP_REG2L, 0x00); - DELAY(10); - ed_asic_outb(sc, ED_CNET98_MAP_REG2H, 0x42); - DELAY(10); - ed_asic_outb(sc, ED_CNET98_MAP_REG3L, 0x00); - DELAY(10); - ed_asic_outb(sc, ED_CNET98_MAP_REG3H, 0x43); - DELAY(10); - - /* - * Enable window memory(16Kbyte) - * bit7 is 1:enable - */ -#ifdef ED_DEBUG - printf("ed?: window start address=%x\n", mem); -#endif - ed_asic_outb(sc, ED_CNET98_WIN_REG, mem); - DELAY(10); -} - -/* - * Probe and vendor-specific initialization routine for C-NET(98) boards - */ -static int -ed_probe_CNET98(device_t dev, int port_rid, int flags) -{ - struct ed_softc *sc = device_get_softc(dev); - int error; - u_char tmp; - rman_res_t conf_irq, junk; -#ifdef DIAGNOSTIC - u_char tmp_s; -#endif - - error = ed98_alloc_port(dev, port_rid); - if (error) - return (error); - - sc->asic_offset = ED_NOVELL_ASIC_OFFSET; - sc->nic_offset = ED_NOVELL_NIC_OFFSET; - - error = ed98_alloc_memory(dev, 0); - if (error) - return (error); - - /* Check I/O address. 0x[a-f]3d0 are allowed. */ - if (((rman_get_start(sc->port_res) & 0x0fff) != 0x03d0) - || ((rman_get_start(sc->port_res) & 0xf000) < (u_short) 0xa000)) { -#ifdef DIAGNOSTIC - device_printf(dev, "Invalid i/o port configuration (0x%jx) " - "must be %s for %s\n", rman_get_start(sc->port_res), - "0x[a-f]3d0", "CNET98"); -#endif - return (ENXIO); - } - -#ifdef DIAGNOSTIC - /* Check window area address */ - tmp_s = rman_get_start(sc->mem_res) >> 12; - if (tmp_s < 0x80) { - device_printf(dev, "Please change window address(0x%jx)\n", - rman_get_start(sc->mem_res)); - return (ENXIO); - } - - tmp_s &= 0x0f; - tmp = rman_get_start(sc->port_res) >> 12; - if ((tmp_s <= tmp) && (tmp < (tmp_s + 4))) { - device_printf(dev, "Please change iobase address(0x%jx) " - "or window address(0x%jx)\n", - rman_get_start(sc->port_res), - rman_get_start(sc->mem_res)); - return (ENXIO); - } -#endif - /* Reset the board */ - ed_reset_CNET98(sc, flags); - - /* - * This is needed because some NE clones apparently don't reset the - * NIC properly (or the NIC chip doesn't reset fully on power-up) XXX - * - this makes the probe invasive! ...Done against my better - * judgement. -DLG - */ - ed_nic_outb(sc, ED_P0_CR, ED_CR_RD2 | ED_CR_STP); - DELAY(5000); - - /* Make sure that we really have an 8390 based board */ - if (!ed98_probe_generic8390(sc)) - return (ENXIO); - - /* - * Set window ethernet address area - * board memory base 0x480000 data 256byte - */ - ed_winsel_CNET98(sc, 0x4800); - - /* - * Get station address from on-board ROM - */ - bus_space_read_region_1(sc->mem_bst, sc->mem_bsh, sc->mem_start, - sc->enaddr, ETHER_ADDR_LEN); - - sc->vendor = ED_VENDOR_MISC; - sc->type_str = "CNET98"; - sc->isa16bit = 0; - sc->cr_proto = ED_CR_RD2; - - /* - * Set window buffer memory area - * board memory base 0x400000 data 16kbyte - */ - ed_winsel_CNET98(sc, 0x4000); - - error = ed_clear_memory(dev); - if (error) - return (error); - - sc->mem_shared = 1; - sc->mem_end = sc->mem_start + sc->mem_size; - - sc->txb_cnt = 1; /* XXX */ - sc->tx_page_start = 0; - - sc->rec_page_start = sc->tx_page_start + ED_TXBUF_SIZE; - sc->rec_page_stop = sc->tx_page_start + sc->mem_size / ED_PAGE_SIZE; - - sc->mem_ring = sc->mem_start + ED_PAGE_SIZE * ED_TXBUF_SIZE; - - /* - * Set interrupt level - */ - error = bus_get_resource(dev, SYS_RES_IRQ, 0, &conf_irq, &junk); - if (error) - return (error); - - switch (conf_irq) { - case 3: - tmp = ED_CNET98_INT_IRQ3; - break; - case 5: - tmp = ED_CNET98_INT_IRQ5; - break; - case 6: - tmp = ED_CNET98_INT_IRQ6; - break; - case 9: - tmp = ED_CNET98_INT_IRQ9; - break; - case 12: - tmp = ED_CNET98_INT_IRQ12; - break; - case 13: - tmp = ED_CNET98_INT_IRQ13; - break; - default: - device_printf(dev, "Invalid irq configuration (%jd) must be " - "%s for %s\n", conf_irq, "3,5,6,9,12,13", "CNET98"); - return (ENXIO); - } - ed_asic_outb(sc, ED_CNET98_INT_LEV, tmp); - DELAY(1000); - /* - * Set interrupt mask. - * bit7:1 all interrupt mask - * bit1:1 timer interrupt mask - * bit0:0 NS controler interrupt enable - */ - ed_asic_outb(sc, ED_CNET98_INT_MASK, 0x7e); - DELAY(1000); - - sc->sc_write_mbufs = ed_shmem_write_mbufs; - return (0); -} - -/* - * Probe and vendor-specific initialization routine for C-NET(98)E/L boards - */ -static int -ed_probe_CNET98EL(device_t dev, int port_rid, int flags) -{ - struct ed_softc *sc = device_get_softc(dev); - int error; - int i; - u_char romdata[ETHER_ADDR_LEN * 2], tmp; - rman_res_t conf_irq, junk; - - error = ed98_alloc_port(dev, port_rid); - if (error) - return (error); - - sc->asic_offset = ED_NOVELL_ASIC_OFFSET; - sc->nic_offset = ED_NOVELL_NIC_OFFSET; - - /* Check I/O address. 0x[0-f]3d0 are allowed. */ - if ((rman_get_start(sc->port_res) & 0x0fff) != 0x03d0) { -#ifdef DIAGNOSTIC - device_printf(dev, "Invalid i/o port configuration (0x%jx) " - "must be %s for %s\n", rman_get_start(sc->port_res), - "0x?3d0", "CNET98E/L"); -#endif - return (ENXIO); - } - - /* Reset the board */ - ed_reset_CNET98(sc, flags); - - /* - * This is needed because some NE clones apparently don't reset the - * NIC properly (or the NIC chip doesn't reset fully on power-up) XXX - * - this makes the probe invasive! ...Done against my better - * judgement. -DLG - */ - ed_nic_outb(sc, ED_P0_CR, ED_CR_RD2 | ED_CR_STP); - DELAY(5000); - - /* Make sure that we really have an 8390 based board */ - if (!ed98_probe_generic8390(sc)) - return (ENXIO); - - /* Test memory via PIO */ - sc->cr_proto = ED_CR_RD2; - if (!ed_pio_testmem(sc, ED_CNET98EL_PAGE_OFFSET, 1, flags)) - return (ENXIO); - - /* This looks like a C-NET(98)E/L board. */ - sc->type_str = "CNET98E/L"; - - /* - * Set IRQ. C-NET(98)E/L only allows a choice of irq 3,5,6. - */ - error = bus_get_resource(dev, SYS_RES_IRQ, 0, &conf_irq, &junk); - if (error) - return (error); - - switch (conf_irq) { - case 3: - tmp = ED_CNET98EL_ICR_IRQ3; - break; - case 5: - tmp = ED_CNET98EL_ICR_IRQ5; - break; - case 6: - tmp = ED_CNET98EL_ICR_IRQ6; - break; -#if 0 - case 12: - tmp = ED_CNET98EL_ICR_IRQ12; - break; -#endif - default: - device_printf(dev, "Invalid irq configuration (%jd) must be " - "%s for %s\n", conf_irq, "3,5,6", "CNET98E/L"); - return (ENXIO); - } - ed_asic_outb(sc, ED_CNET98EL_ICR, tmp); - ed_asic_outb(sc, ED_CNET98EL_IMR, 0x7e); - - /* Get station address from on-board ROM */ - ed_pio_readmem(sc, 16384, romdata, sizeof(romdata)); - for (i = 0; i < ETHER_ADDR_LEN; i++) - sc->enaddr[i] = romdata[i * 2]; - - /* clear any pending interrupts that might have occurred above */ - ed_nic_outb(sc, ED_P0_ISR, 0xff); - - sc->sc_write_mbufs = ed_pio_write_mbufs; - return (0); -} - -/* - * Probe and vendor-specific initialization routine for PC-9801-77 boards - */ -static int -ed_probe_NEC77(device_t dev, int port_rid, int flags) -{ - struct ed_softc *sc = device_get_softc(dev); - int error; - u_char tmp; - rman_res_t conf_irq, junk; - - error = ed98_probe_Novell(dev, port_rid, flags); - if (error) - return (error); - - /* LA/T-98 does not need IRQ setting. */ - if (ED_TYPE98SUB(flags) == 0) - return (0); - - /* - * Set IRQ. PC-9801-77 only allows a choice of irq 3,5,6,12,13. - */ - error = bus_get_resource(dev, SYS_RES_IRQ, 0, &conf_irq, &junk); - if (error) - return (error); - - switch (conf_irq) { - case 3: - tmp = ED_NEC77_IRQ3; - break; - case 5: - tmp = ED_NEC77_IRQ5; - break; - case 6: - tmp = ED_NEC77_IRQ6; - break; - case 12: - tmp = ED_NEC77_IRQ12; - break; - case 13: - tmp = ED_NEC77_IRQ13; - break; - default: - device_printf(dev, "Invalid irq configuration (%jd) must be " - "%s for %s\n", conf_irq, "3,5,6,12,13", "PC-9801-77"); - return (ENXIO); - } - ed_asic_outb(sc, ED_NEC77_IRQ, tmp); - - return (0); -} - -/* - * Probe and vendor-specific initialization routine for EC/EP-98X boards - */ -static int -ed_probe_NW98X(device_t dev, int port_rid, int flags) -{ - struct ed_softc *sc = device_get_softc(dev); - int error; - u_char tmp; - rman_res_t conf_irq, junk; - - error = ed98_probe_Novell(dev, port_rid, flags); - if (error) - return (error); - - /* Networld 98X3 does not need IRQ setting. */ - if (ED_TYPE98SUB(flags) == 0) - return (0); - - /* - * Set IRQ. EC/EP-98X only allows a choice of irq 3,5,6,12,13. - */ - error = bus_get_resource(dev, SYS_RES_IRQ, 0, &conf_irq, &junk); - if (error) - return (error); - - switch (conf_irq) { - case 3: - tmp = ED_NW98X_IRQ3; - break; - case 5: - tmp = ED_NW98X_IRQ5; - break; - case 6: - tmp = ED_NW98X_IRQ6; - break; - case 12: - tmp = ED_NW98X_IRQ12; - break; - case 13: - tmp = ED_NW98X_IRQ13; - break; - default: - device_printf(dev, "Invalid irq configuration (%jd) must be " - "%s for %s\n", conf_irq, "3,5,6,12,13", "EC/EP-98X"); - return (ENXIO); - } - ed_asic_outb(sc, ED_NW98X_IRQ, tmp); - - return (0); -} - -/* - * Read SB-9801 station address from Serial Two-Wire EEPROM - */ -static void -ed_get_SB98(struct ed_softc *sc) -{ - int i, j; - u_char mask, val; - - /* enable EEPROM acceess */ - ed_asic_outb(sc, ED_SB98_EEPENA, ED_SB98_EEPENA_ENABLE); - - /* output start command */ - ed_asic_outb(sc, ED_SB98_EEP, ED_SB98_EEP_SDA | ED_SB98_EEP_SCL); - DELAY(ED_SB98_EEP_DELAY); - ed_asic_outb(sc, ED_SB98_EEP, ED_SB98_EEP_SCL); - DELAY(ED_SB98_EEP_DELAY); - - /* output address (7bit) */ - for (mask = 0x40; mask != 0; mask >>= 1) { - val = 0; - if (ED_SB98_ADDRESS & mask) - val = ED_SB98_EEP_SDA; - ed_asic_outb(sc, ED_SB98_EEP, val); - DELAY(ED_SB98_EEP_DELAY); - ed_asic_outb(sc, ED_SB98_EEP, val | ED_SB98_EEP_SCL); - DELAY(ED_SB98_EEP_DELAY); - } - - /* output READ command */ - ed_asic_outb(sc, ED_SB98_EEP, ED_SB98_EEP_READ); - DELAY(ED_SB98_EEP_DELAY); - ed_asic_outb(sc, ED_SB98_EEP, ED_SB98_EEP_READ | ED_SB98_EEP_SCL); - DELAY(ED_SB98_EEP_DELAY); - - /* read station address */ - for (i = 0; i < ETHER_ADDR_LEN; i++) { - /* output ACK */ - ed_asic_outb(sc, ED_SB98_EEP, 0); - DELAY(ED_SB98_EEP_DELAY); - ed_asic_outb(sc, ED_SB98_EEP, ED_SB98_EEP_SCL); - DELAY(ED_SB98_EEP_DELAY); - - val = 0; - for (j = 0; j < 8; j++) { - ed_asic_outb(sc, ED_SB98_EEP, ED_SB98_EEP_SDA); - DELAY(ED_SB98_EEP_DELAY); - ed_asic_outb(sc, ED_SB98_EEP, ED_SB98_EEP_SDA | ED_SB98_EEP_SCL); - DELAY(ED_SB98_EEP_DELAY); - val <<= 1; - val |= (ed_asic_inb(sc, ED_SB98_EEP) & ED_SB98_EEP_SDA); - DELAY(ED_SB98_EEP_DELAY); - } - sc->enaddr[i] = val; - } - - /* output Last ACK */ - ed_asic_outb(sc, ED_SB98_EEP, ED_SB98_EEP_SDA); - DELAY(ED_SB98_EEP_DELAY); - ed_asic_outb(sc, ED_SB98_EEP, ED_SB98_EEP_SDA | ED_SB98_EEP_SCL); - DELAY(ED_SB98_EEP_DELAY); - - /* output stop command */ - ed_asic_outb(sc, ED_SB98_EEP, ED_SB98_EEP_SCL); - DELAY(ED_SB98_EEP_DELAY); - ed_asic_outb(sc, ED_SB98_EEP, ED_SB98_EEP_SDA | ED_SB98_EEP_SCL); - DELAY(ED_SB98_EEP_DELAY); - - /* disable EEPROM access */ - ed_asic_outb(sc, ED_SB98_EEPENA, ED_SB98_EEPENA_DISABLE); -} - -/* - * Probe and vendor-specific initialization routine for SB-9801 boards - */ -static int -ed_probe_SB98(device_t dev, int port_rid, int flags) -{ - struct ed_softc *sc = device_get_softc(dev); - int error; - u_char tmp; - rman_res_t conf_irq, junk; - - error = ed98_alloc_port(dev, port_rid); - if (error) - return (error); - - sc->asic_offset = ED_NOVELL_ASIC_OFFSET; - sc->nic_offset = ED_NOVELL_NIC_OFFSET; - - /* Check I/O address. 00d[02468ace] are allowed. */ - if ((rman_get_start(sc->port_res) & ~0x000e) != 0x00d0) { -#ifdef DIAGNOSTIC - device_printf(dev, "Invalid i/o port configuration (0x%jx) " - "must be %s for %s\n", rman_get_start(sc->port_res), - "0xd?", "SB9801"); -#endif - return (ENXIO); - } - - /* Write I/O port address and read 4 times */ - outb(ED_SB98_IO_INHIBIT, rman_get_start(sc->port_res) & 0xff); - (void) inb(ED_SB98_IO_INHIBIT); DELAY(300); - (void) inb(ED_SB98_IO_INHIBIT); DELAY(300); - (void) inb(ED_SB98_IO_INHIBIT); DELAY(300); - (void) inb(ED_SB98_IO_INHIBIT); DELAY(300); - - /* - * Check IRQ. Soliton SB-9801 only allows a choice of - * irq 3,5,6,12 - */ - error = bus_get_resource(dev, SYS_RES_IRQ, 0, &conf_irq, &junk); - if (error) - return (error); - - switch (conf_irq) { - case 3: - tmp = ED_SB98_CFG_IRQ3; - break; - case 5: - tmp = ED_SB98_CFG_IRQ5; - break; - case 6: - tmp = ED_SB98_CFG_IRQ6; - break; - case 12: - tmp = ED_SB98_CFG_IRQ12; - break; - default: - device_printf(dev, "Invalid irq configuration (%jd) must be " - "%s for %s\n", conf_irq, "3,5,6,12", "SB9801"); - return (ENXIO); - } - - if (flags & ED_FLAGS_DISABLE_TRANCEIVER) - tmp |= ED_SB98_CFG_ALTPORT; - ed_asic_outb(sc, ED_SB98_CFG, ED_SB98_CFG_ENABLE | tmp); - ed_asic_outb(sc, ED_SB98_POLARITY, 0x01); - - /* Reset the board. */ - ed_asic_outb(sc, ED_NOVELL_RESET, 0x7a); - DELAY(300); - ed_asic_outb(sc, ED_NOVELL_RESET, 0x79); - DELAY(300); - - /* - * This is needed because some NE clones apparently don't reset the - * NIC properly (or the NIC chip doesn't reset fully on power-up) XXX - * - this makes the probe invasive! ...Done against my better - * judgement. -DLG - */ - ed_nic_outb(sc, ED_P0_CR, ED_CR_RD2 | ED_CR_STP); - DELAY(5000); - - /* Make sure that we really have an 8390 based board */ - if (!ed98_probe_generic8390(sc)) - return (ENXIO); - - /* Test memory via PIO */ - sc->cr_proto = ED_CR_RD2; - if (!ed_pio_testmem(sc, 16384, 1, flags)) - return (ENXIO); - - /* This looks like an SB9801 board. */ - sc->type_str = "SB9801"; - - /* Get station address */ - ed_get_SB98(sc); - - /* clear any pending interrupts that might have occurred above */ - ed_nic_outb(sc, ED_P0_ISR, 0xff); - - sc->sc_write_mbufs = ed_pio_write_mbufs; - return (0); -} - -/* - * Test the ability to read and write to the NIC memory. - */ -static int -ed_pio_testmem(struct ed_softc *sc, int page_offset, int isa16bit, int flags) -{ - u_long memsize; - static char test_pattern[32] = "THIS is A memory TEST pattern"; - char test_buffer[32]; -#ifdef DIAGNOSTIC - int page_end; -#endif - - sc->vendor = ED_VENDOR_NOVELL; - sc->mem_shared = 0; - sc->isa16bit = isa16bit; - - /* 8k of memory plus an additional 8k if 16bit */ - memsize = (isa16bit ? 16384 : 8192); - - /* - * This prevents packets from being stored in the NIC memory when the - * readmem routine turns on the start bit in the CR. - */ - ed_nic_outb(sc, ED_P0_RCR, ED_RCR_MON); - - /* Initialize DCR for byte/word operations */ - if (isa16bit) - ed_nic_outb(sc, ED_P0_DCR, ED_DCR_WTS | ED_DCR_FT1 | ED_DCR_LS); - else - ed_nic_outb(sc, ED_P0_DCR, ED_DCR_FT1 | ED_DCR_LS); - ed_nic_outb(sc, ED_P0_PSTART, page_offset / ED_PAGE_SIZE); - ed_nic_outb(sc, ED_P0_PSTOP, (page_offset + memsize) / ED_PAGE_SIZE); -#ifdef ED_DEBUG - printf("ed?: ed_pio_testmem: page start=%x, end=%lx", - page_offset, page_offset + memsize); -#endif - - /* - * Write a test pattern. If this fails, then we don't know - * what this board is. - */ - ed_pio_writemem(sc, test_pattern, page_offset, sizeof(test_pattern)); - ed_pio_readmem(sc, page_offset, test_buffer, sizeof(test_pattern)); - - if (bcmp(test_pattern, test_buffer, sizeof(test_pattern))) { -#ifdef ED_DEBUG - printf("ed?: ed_pio_testmem: bcmp(page %x) NG", page_offset); -#endif - return (0); - } - -#ifdef DIAGNOSTIC - /* Check the bottom. */ - page_end = page_offset + memsize - ED_PAGE_SIZE; - ed_pio_writemem(sc, test_pattern, page_end, sizeof(test_pattern)); - ed_pio_readmem(sc, page_end, test_buffer, sizeof(test_pattern)); - - if (bcmp(test_pattern, test_buffer, sizeof(test_pattern))) { -#ifdef ED_DEBUG - printf("ed?: ed_pio_testmem: bcmp(page %x) NG", page_end); -#endif - return (0); - } -#endif - sc->mem_size = memsize; - sc->mem_start = page_offset; - sc->mem_end = sc->mem_start + memsize; - sc->tx_page_start = page_offset / ED_PAGE_SIZE; - - /* - * Use one xmit buffer if < 16k, two buffers otherwise (if not told - * otherwise). - */ - if ((memsize < 16384) || (flags & ED_FLAGS_NO_MULTI_BUFFERING)) - sc->txb_cnt = 1; - else - sc->txb_cnt = 2; - - sc->rec_page_start = sc->tx_page_start + sc->txb_cnt * ED_TXBUF_SIZE; - sc->rec_page_stop = sc->tx_page_start + memsize / ED_PAGE_SIZE; - - sc->mem_ring = sc->mem_start + sc->txb_cnt * ED_PAGE_SIZE * ED_TXBUF_SIZE; - - return (1); -} - -static device_method_t ed_cbus_methods[] = { - /* Device interface */ - DEVMETHOD(device_probe, ed_cbus_probe), - DEVMETHOD(device_attach, ed_cbus_attach), - DEVMETHOD(device_detach, ed_detach), - - { 0, 0 } -}; - -static driver_t ed_cbus_driver = { - "ed", - ed_cbus_methods, - sizeof(struct ed_softc) -}; - -DRIVER_MODULE(ed, isa, ed_cbus_driver, ed_devclass, 0, 0); -MODULE_DEPEND(ed, isa, 1, 1, 1); -MODULE_DEPEND(ed, ether, 1, 1, 1); diff --git a/sys/dev/ep/if_ep_isa.c b/sys/dev/ep/if_ep_isa.c index e125daf101fd..7bcb3d410057 100644 --- a/sys/dev/ep/if_ep_isa.c +++ b/sys/dev/ep/if_ep_isa.c @@ -76,10 +76,6 @@ const char *ep_isa_match_id(uint32_t, struct isa_ident *); #define ISA_ID_3C509_COMBO 0x506d5094 #define ISA_ID_3C509_TPO 0x506d5095 #define ISA_ID_3C509_TPC 0x506d5098 -#ifdef PC98 -#define ISA_ID_3C569B_COMBO 0x506d5694 -#define ISA_ID_3C569B_TPO 0x506d5695 -#endif #ifdef __i386__ static struct isa_ident ep_isa_devs[] = { @@ -88,10 +84,6 @@ static struct isa_ident ep_isa_devs[] = { {ISA_ID_3C509_COMBO, "3Com 3C509-Combo EtherLink III"}, {ISA_ID_3C509_TPO, "3Com 3C509-TPO EtherLink III"}, {ISA_ID_3C509_TPC, "3Com 3C509-TPC EtherLink III"}, -#ifdef PC98 - {ISA_ID_3C569B_COMBO, "3Com 3C569B-J-Combo EtherLink III"}, - {ISA_ID_3C569B_TPO, "3Com 3C569B-J-TPO EtherLink III"}, -#endif {0, NULL}, }; #endif @@ -224,11 +216,7 @@ ep_isa_identify(driver_t * driver, device_t parent) /* Retreive IOPORT */ data = get_eeprom_data(ELINK_ID_PORT, EEPROM_ADDR_CFG); -#ifdef PC98 - ioport = (((data & ADDR_CFG_MASK) * 0x100) + 0x40d0); -#else ioport = (((data & ADDR_CFG_MASK) << 4) + 0x200); -#endif if ((data & ADDR_CFG_MASK) == ADDR_CFG_EISA) { device_printf(parent, diff --git a/sys/dev/exca/excareg.h b/sys/dev/exca/excareg.h index c445efe60583..ecde55a4a1de 100644 --- a/sys/dev/exca/excareg.h +++ b/sys/dev/exca/excareg.h @@ -417,10 +417,6 @@ #define EXCA_PNP_82365_CARDBUS 0x030ED041 /* PNP0E03 */ #define EXCA_PNP_SCM_SWAPBOX 0x69046d4c /* SMC0469 */ -/* C-Bus PnP Definitions */ -#define EXCA_NEC_PC9801_102 0x9180a3b8 /* NEC8091 PC-9801-102 */ -#define EXCA_NEC_PC9821RA_E01 0x2181a3b8 /* NEC8121 PC-9821RA-E01 */ - /* * Mask of allowable interrupts. * @@ -433,20 +429,7 @@ * NT had a special device that would probe for conflicts early in the * boot process and formulate a mapping table. Maybe we should do * something similar. - * - * For NEC PC-98 machines, irq 3, 5, 6, 9, 10, 11, 12, 13 are allowed. - * These correspond to the C-BUS signals INT 0, 1, 2, 3, 41, 42, 5, 6 - * respectively. - * - * Hiroshi TSUKADA-san writes in FreeBSD98-testers that CBUS INT 2 - * (mapped to IRQ 6) is routed to the IRQ 7 pin of the pcic in pc98 - * cbus add-in cards. He has confirmed this routing with a visual - * inspection of his card or a VOM. */ -#ifdef PC98 -#define EXCA_INT_MASK_ALLOWED 0x3E68 /* PC98 */ -#else #define EXCA_INT_MASK_ALLOWED 0xDEB8 /* AT */ -#endif #endif /* !_SYS_DEV_EXCA_EXCAREG_H */ diff --git a/sys/dev/fb/fb.c b/sys/dev/fb/fb.c index 183abdc3bfcb..169dacc77360 100644 --- a/sys/dev/fb/fb.c +++ b/sys/dev/fb/fb.c @@ -530,7 +530,6 @@ static char { KD_CGA, "CGA" }, { KD_EGA, "EGA" }, { KD_VGA, "VGA" }, - { KD_PC98, "PC-98x1" }, { KD_TGA, "TGA" }, { -1, "Unknown" }, }; @@ -605,7 +604,6 @@ fb_type(int adp_type) { FBTYPE_CGA, KD_CGA }, { FBTYPE_EGA, KD_EGA }, { FBTYPE_VGA, KD_VGA }, - { FBTYPE_PC98, KD_PC98 }, { FBTYPE_TGA, KD_TGA }, }; int i; diff --git a/sys/dev/fb/splash_bmp.c b/sys/dev/fb/splash_bmp.c index 517a3efd73f3..719725ee0fe6 100644 --- a/sys/dev/fb/splash_bmp.c +++ b/sys/dev/fb/splash_bmp.c @@ -36,11 +36,9 @@ #include <dev/fb/fbreg.h> #include <dev/fb/splashreg.h> -#ifndef PC98 #include <dev/fb/vgareg.h> #include <isa/isareg.h> -#endif #define FADE_TIMEOUT 15 /* sec */ #define FADE_LEVELS 10 @@ -65,15 +63,6 @@ bmp_start(video_adapter_t *adp) { /* currently only 256-color modes are supported XXX */ static int modes[] = { -#ifdef PC98 - /* - * As 640x400 doesn't generally look great, - * it's least preferred here. - */ - M_PC98_PEGC640x400, - M_PC98_PEGC640x480, - M_PC98_EGC640x400, -#else M_VESA_CG640x480, M_VESA_CG800x600, M_VESA_CG1024x768, @@ -83,7 +72,6 @@ bmp_start(video_adapter_t *adp) * it's least preferred here. */ M_VGA_CG320, -#endif -1, }; video_info_t info; @@ -239,9 +227,6 @@ typedef struct u_char *vidmem; /* video memory allocated for drawing */ video_adapter_t *adp; int bank; -#ifdef PC98 - u_char prev_val; -#endif } BMP_INFO; static BMP_INFO bmp_info; @@ -273,25 +258,6 @@ bmp_SetPix(BMP_INFO *info, int x, int y, u_char val) x += (info->swidth - info->width) / 2; switch(info->sdepth) { -#ifdef PC98 - case 4: - sofs += (x >> 3); - bofs = x & 0x7; /* offset within byte */ - - outb(0x7c, 0x80 | 0x40); /* GRCG on & RMW mode */ - if (val != info->prev_val) { - outb(0x7e, (val & 1) ? 0xff : 0); /* tile B */ - outb(0x7e, (val & 2) ? 0xff : 0); /* tile R */ - outb(0x7e, (val & 4) ? 0xff : 0); /* tile G */ - outb(0x7e, (val & 8) ? 0xff : 0); /* tile I */ - - info->prev_val = val; - } - - *(info->vidmem+sofs) = (0x80 >> bofs); /* write new bit */ - outb(0x7c, 0); /* GRCG off */ - break; -#else case 4: case 1: /* EGA/VGA planar modes */ @@ -307,7 +273,6 @@ bmp_SetPix(BMP_INFO *info, int x, int y, u_char val) outw(GDCIDX, (val << 8) | 0x00); /* set/reset */ *(info->vidmem + sofs) ^= 0xff; /* read-modify-write */ break; -#endif case 8: sofs += x; @@ -589,10 +554,8 @@ bmp_Draw(video_adapter_t *adp) { int line; #if 0 -#ifndef PC98 int i; #endif -#endif if (bmp_info.data == NULL) { /* init failed, do nothing */ return(1); @@ -607,15 +570,11 @@ bmp_Draw(video_adapter_t *adp) /* initialise the info structure for drawing */ bmp_info.index = bmp_info.data; -#ifdef PC98 - bmp_info.prev_val = 255; -#endif /* set the palette for our image */ vidd_load_palette(adp, (u_char *)&bmp_info.palette); #if 0 -#ifndef PC98 /* XXX: this is ugly, but necessary for EGA/VGA 1bpp/4bpp modes */ if ((adp->va_type == KD_EGA) || (adp->va_type == KD_VGA)) { inb(adp->va_crtc_addr + 6); /* reset flip-flop */ @@ -634,7 +593,6 @@ bmp_Draw(video_adapter_t *adp) outw(TSIDX, 0x0102); /* unmask plane #0 */ } #endif -#endif for (line = 0; (line < bmp_info.height) && bmp_info.index; line++) { bmp_DecodeLine(&bmp_info, line); diff --git a/sys/dev/fdc/fdc.c b/sys/dev/fdc/fdc.c index 699ccbb2ca64..bb322aa318d2 100644 --- a/sys/dev/fdc/fdc.c +++ b/sys/dev/fdc/fdc.c @@ -82,12 +82,8 @@ __FBSDID("$FreeBSD$"); #include <machine/stdarg.h> #include <isa/isavar.h> -#ifdef PC98 -#include <pc98/pc98/pc98_machdep.h> -#else #include <isa/isareg.h> #include <isa/rtc.h> -#endif #include <dev/fdc/fdcvar.h> #include <dev/ic/nec765.h> @@ -140,57 +136,34 @@ __FBSDID("$FreeBSD$"); */ static struct fd_type fd_searchlist_360k[] = { -#ifndef PC98 { FDF_5_360 }, -#endif { 0 } }; static struct fd_type fd_searchlist_12m[] = { -#ifdef PC98 - { FDF_5_1200 | FL_AUTO }, - { FDF_5_720 | FL_AUTO }, - { FDF_5_360 | FL_AUTO }, - { FDF_5_640 | FL_AUTO }, - { FDF_5_1230 | FL_AUTO }, -#else { FDF_5_1200 | FL_AUTO }, { FDF_5_400 | FL_AUTO }, { FDF_5_360 | FL_2STEP | FL_AUTO}, -#endif { 0 } }; static struct fd_type fd_searchlist_720k[] = { -#ifndef PC98 { FDF_3_720 }, -#endif { 0 } }; static struct fd_type fd_searchlist_144m[] = { -#ifdef PC98 { FDF_3_1440 | FL_AUTO}, - { FDF_3_1200 | FL_AUTO}, { FDF_3_720 | FL_AUTO}, - { FDF_3_360 | FL_AUTO}, - { FDF_3_640 | FL_AUTO}, - { FDF_3_1230 | FL_AUTO}, -#else - { FDF_3_1440 | FL_AUTO}, - { FDF_3_720 | FL_AUTO}, -#endif { 0 } }; static struct fd_type fd_searchlist_288m[] = { -#ifndef PC98 { FDF_3_1440 | FL_AUTO }, #if 0 { FDF_3_2880 | FL_AUTO }, /* XXX: probably doesn't work */ #endif { FDF_3_720 | FL_AUTO}, -#endif { 0 } }; @@ -211,26 +184,6 @@ static struct fd_type *fd_native_types[] = { * Internals start here */ -#ifdef PC98 -/* registers */ -#define FDSTS 0 /* NEC 765 Main Status Register (R) */ -#define FDDATA 1 /* NEC 765 Data Register (R/W) */ -#define FDCTL 2 /* FD Control Register */ -#define FDC_RST 0x80 /* FDC RESET */ -#define FDC_RDY 0x40 /* force READY */ -#define FDC_DD 0x20 /* FDD Mode Exchange 0:1M 1:640K */ -#define FDC_DMAE 0x10 /* enable floppy DMA */ -#define FDC_MTON 0x08 /* MOTOR ON (when EMTON=1)*/ -#define FDC_TMSK 0x04 /* TIMER MASK */ -#define FDC_TTRG 0x01 /* TIMER TRIGER */ - -#define FDP 3 -#define FDP_EMTON 0x04 /* enable MTON */ -#define FDP_FDDEXC 0x02 /* FDD Mode Exchange 1:1M 0:640K */ -#define FDP_PORTEXC 0x01 /* PORT Exchane 1:1M 0:640K */ - -#define FDEM 4 -#else /* registers */ #define FDOUT 2 /* Digital Output Register (W) */ #define FDO_FDSEL 0x03 /* floppy device select */ @@ -245,7 +198,6 @@ static struct fd_type *fd_native_types[] = { #define FDDSR 4 /* Data Rate Select Register (W) */ #define FDDATA 5 /* NEC 765 Data Register (R/W) */ #define FDCTL 7 /* Control Register (W) */ -#endif /* PC98 */ /* * The YE-DATA PC Card floppies use PIO to read in the data rather @@ -268,11 +220,9 @@ static struct fd_type *fd_native_types[] = { #define FDBCDR 0 /* And 1 */ #define FD_YE_DATAPORT 6 /* Drive Data port */ -#ifndef PC98 #define FDI_DCHG 0x80 /* diskette has been changed */ /* requires drive and motor being selected */ /* is cleared by any step pulse to drive */ -#endif /* * We have three private BIO commands. @@ -309,9 +259,6 @@ struct fd_data { struct g_provider *fd_provider; device_t dev; struct bio_queue_head fd_bq; -#ifdef PC98 - int pc98_trans; -#endif }; #define FD_NOT_VALID -2 @@ -335,19 +282,11 @@ static int retries = 10; SYSCTL_INT(_debug_fdc, OID_AUTO, retries, CTLFLAG_RW, &retries, 0, "Number of retries to attempt"); -#ifdef PC98 -static int spec1 = NE7_SPEC_1(4, 240); -#else static int spec1 = NE7_SPEC_1(6, 240); -#endif SYSCTL_INT(_debug_fdc, OID_AUTO, spec1, CTLFLAG_RW, &spec1, 0, "Specification byte one (step-rate + head unload)"); -#ifdef PC98 -static int spec2 = NE7_SPEC_2(2, 0); -#else static int spec2 = NE7_SPEC_2(16, 0); -#endif SYSCTL_INT(_debug_fdc, OID_AUTO, spec2, CTLFLAG_RW, &spec2, 0, "Specification byte two (head load time + no-dma)"); @@ -397,14 +336,12 @@ fdctl_wr(struct fdc_data *fdc, u_int8_t v) fdregwr(fdc, FDCTL, v); } -#ifndef PC98 static void fdout_wr(struct fdc_data *fdc, u_int8_t v) { fdregwr(fdc, FDOUT, v); } -#endif static u_int8_t fdsts_rd(struct fdc_data *fdc) @@ -413,14 +350,12 @@ fdsts_rd(struct fdc_data *fdc) return fdregrd(fdc, FDSTS); } -#ifndef PC98 static void fddsr_wr(struct fdc_data *fdc, u_int8_t v) { fdregwr(fdc, FDDSR, v); } -#endif static void fddata_wr(struct fdc_data *fdc, u_int8_t v) @@ -436,14 +371,12 @@ fddata_rd(struct fdc_data *fdc) return fdregrd(fdc, FDDATA); } -#ifndef PC98 static u_int8_t fdin_rd(struct fdc_data *fdc) { return fdregrd(fdc, FDCTL); } -#endif /* * Magic pseudo-DMA initialization for YE FDC. Sets count and @@ -570,90 +503,11 @@ fdc_cmd(struct fdc_data *fdc, int n_out, ...) return (0); } -#ifdef PC98 -static void fd_motor(struct fd_data *fd, int turnon); - -static int pc98_trans = 0; /* 0 : HD , 1 : DD , 2 : 1.44 */ -static int pc98_trans_prev = -1; - -static void -set_density(struct fdc_data *fdc) -{ - /* always motor on */ - fdregwr(fdc, FDP, (pc98_trans != 1 ? FDP_FDDEXC : 0) | FDP_PORTEXC); - DELAY(100); - fdctl_wr(fdc, FDC_RST | FDC_DMAE); - /* in the case of note W, always inhibit 100ms timer */ -} - -static int -pc98_fd_check_ready(struct fd_data *fd) -{ - struct fdc_data *fdc = fd->fdc; - int retry = 0, status; - int fdu = device_get_unit(fd->dev); - - while (retry++ < 30000) { - fd_motor(fd, 1); - fdc_out(fdc, NE7CMD_SENSED); /* Sense Drive Status */ - DELAY(100); - fdc_out(fdc, fdu); /* Drive number */ - DELAY(100); - if ((fdc_in(fdc, &status) == 0) && (status & NE7_ST3_RD)) { - fdctl_wr(fdc, FDC_DMAE | FDC_MTON); - DELAY(10); - return (0); - } - } - return (-1); -} - -static void -pc98_fd_check_type(struct fd_data *fd, int unit) -{ - struct fdc_data *fdc; - - if (fd->type != FDT_NONE || unit < 0 || unit > 3) - return; - - fdc = fd->fdc; - - /* Look up what the BIOS thinks we have. */ - if (!((PC98_SYSTEM_PARAMETER(0x55c) >> unit) & 0x01)) { - fd->type = FDT_NONE; - return; - } - if ((PC98_SYSTEM_PARAMETER(0x5ae) >> unit) & 0x01) { - /* Check 3mode I/F */ - fd->pc98_trans = 0; - fdregwr(fdc, FDEM, (unit << 5) | 0x10); - if (!(fdregrd(fdc, FDEM) & 0x01)) { - fd->type = FDT_144M; - return; - } - device_printf(fd->dev, - "Warning: can't control 3mode I/F, fallback to 2mode.\n"); - } - - fd->type = FDT_12M; -} -#endif /* PC98 */ - static void fdc_reset(struct fdc_data *fdc) { int i, r[10]; -#ifdef PC98 - set_density(fdc); - if (pc98_machine_type & M_EPSON_PC98) - fdctl_wr(fdc, FDC_RST | FDC_RDY | FDC_DD | FDC_MTON); - else - fdctl_wr(fdc, FDC_RST | FDC_RDY | FDC_DMAE | FDC_MTON); - DELAY(200); - fdctl_wr(fdc, FDC_DMAE | FDC_MTON); - DELAY(10); -#else if (fdc->fdct == FDC_ENHANCED) { /* Try a software reset, default precomp, and 500 kb/s */ fddsr_wr(fdc, I8207X_DSR_SR); @@ -666,7 +520,6 @@ fdc_reset(struct fdc_data *fdc) } DELAY(100); fdout_wr(fdc, fdc->fdout); -#endif /* XXX after a reset, silently believe the FDC will accept commands */ if (fdc_cmd(fdc, 3, NE7CMD_SPECIFY, spec1, spec2, 0)) @@ -760,7 +613,6 @@ fdc_read_status(struct fdc_data *fdc) return ret; } -#ifndef PC98 /* * Select this drive */ @@ -798,7 +650,6 @@ fd_turnon(void *arg) if (once) wakeup(&fd->fdc->head); } -#endif static void fd_motor(struct fd_data *fd, int turnon) @@ -809,11 +660,6 @@ fd_motor(struct fd_data *fd, int turnon) /* mtx_assert(&fdc->fdc_mtx, MA_OWNED); */ -#ifdef PC98 - fdregwr(fdc, FDP, (pc98_trans != 1 ? FDP_FDDEXC : 0) | FDP_PORTEXC); - DELAY(10); - fdctl_wr(fdc, FDC_DMAE | FDC_MTON); -#else if (turnon) { fd->flags |= FD_MOTORWAIT; fdc->fdout |= (FDO_MOEN0 << fd->fdsu); @@ -824,7 +670,6 @@ fd_motor(struct fd_data *fd, int turnon) fdc->fdout &= ~(FDO_MOEN0 << fd->fdsu); } fdout_wr(fdc, fdc->fdout); -#endif } static void @@ -995,41 +840,15 @@ fdc_worker(struct fdc_data *fdc) } /* Select drive, setup params */ -#ifdef PC98 - pc98_trans = fd->ft->trans; - if (pc98_trans_prev != pc98_trans) { - int i; - - set_density(fdc); - for (i = 0; i < 10; i++) { - outb(0x5f, 0); - outb(0x5f, 0); - } - pc98_trans_prev = pc98_trans; - } - if (pc98_trans != fd->pc98_trans) { - if (fd->type == FDT_144M) { - fdregwr(fdc, FDEM, - (device_get_unit(fd->dev) << 5) | 0x10 | - (pc98_trans >> 1)); - outb(0x5f, 0); - outb(0x5f, 0); - } - fd->pc98_trans = pc98_trans; - } -#else fd_select(fd); if (fdc->fdct == FDC_ENHANCED) fddsr_wr(fdc, fd->ft->trans); else fdctl_wr(fdc, fd->ft->trans); -#endif if (bp->bio_cmd == BIO_PROBE) { if ((!(device_get_flags(fd->dev) & FD_NO_CHLINE) && -#ifndef PC98 !(fdin_rd(fdc) & FDI_DCHG) && -#endif !(fd->flags & FD_EMPTY)) || fd_probe_disk(fd, &need_recal) == 0) return (fdc_biodone(fdc, 0)); @@ -1042,7 +861,6 @@ fdc_worker(struct fdc_data *fdc) if (fd->flags & FD_EMPTY) return (fdc_biodone(fdc, ENXIO)); -#ifndef PC98 /* Check if we lost our media */ if (fdin_rd(fdc) & FDI_DCHG) { if (debugflags & 0x40) @@ -1060,7 +878,6 @@ fdc_worker(struct fdc_data *fdc) g_topology_unlock(); return (fdc_biodone(fdc, ENXIO)); } -#endif /* Check if the floppy is write-protected */ if (bp->bio_cmd == BIO_FMT || bp->bio_cmd == BIO_WRITE) { @@ -1095,9 +912,6 @@ fdc_worker(struct fdc_data *fdc) if ((need_recal & (1 << fd->fdsu)) || (cylinder == 0 && fd->track != 0) || fdc->retry > 2) { -#ifdef PC98 - pc98_fd_check_ready(fd); -#endif retry_line = __LINE__; if (fdc_cmd(fdc, 2, NE7CMD_RECAL, fd->fdsu, 0)) return (1); @@ -1119,9 +933,6 @@ fdc_worker(struct fdc_data *fdc) * SEEK to where we want to be */ if (cylinder != fd->track) { -#ifdef PC98 - pc98_fd_check_ready(fd); -#endif retry_line = __LINE__; if (fdc_cmd(fdc, 3, NE7CMD_SEEK, fd->fdsu, descyl, 0)) return (1); @@ -1429,7 +1240,6 @@ fd_probe_disk(struct fd_data *fd, int *recal) if (fdc_sense_int(fdc, &st0, &cyl) == FD_NOT_VALID) goto done; /* XXX */ *recal |= (1 << fd->fdsu); -#ifndef PC98 if (fdin_rd(fdc) & FDI_DCHG) { if (debugflags & 0x40) printf("Empty in probe\n"); @@ -1437,9 +1247,6 @@ fd_probe_disk(struct fd_data *fd, int *recal) fd->flags |= FD_EMPTY; mtx_unlock(&fdc->fdc_mtx); } else { -#else - { -#endif if (fdc_sense_drive(fdc, &st3) != 0) goto done; if (debugflags & 0x40) @@ -1576,11 +1383,7 @@ fdautoselect(struct fd_data *fd) if (debugflags & 0x40) { device_printf(fd->dev, "autoselected %d KB medium\n", -#ifdef PC98 - (128 << (fd->ft->secsize)) * fd->ft->size / 1024); -#else fd->ft->size / 2); -#endif fdprinttype(fd->ft); } return (0); @@ -1633,10 +1436,6 @@ fd_access(struct g_provider *pp, int r, int w, int e) busy = 0; if (pp->acr == 0 && pp->acw == 0 && pp->ace == 0) { -#ifdef PC98 - if (pc98_fd_check_ready(fd) == -1) - return (ENXIO); -#endif if (fdmisccmd(fd, BIO_PROBE, NULL)) return (ENXIO); if (fd->flags & FD_EMPTY) @@ -1706,10 +1505,6 @@ fd_ioctl(struct g_provider *pp, u_long cmd, void *data, int fflag, struct thread fd = pp->geom->softc; -#ifdef PC98 - pc98_fd_check_ready(fd); -#endif - switch (cmd) { case FD_GTYPE: /* get drive type */ *(struct fd_type *)data = *fd->ft; @@ -1877,12 +1672,6 @@ fdc_initial_reset(device_t dev, struct fdc_data *fdc) { int ic_type, part_id; -#ifdef PC98 - /* See if it can handle a command. */ - if (fdc_cmd(fdc, 3, NE7CMD_SPECIFY, NE7_SPEC_1(4, 240), - NE7_SPEC_2(2, 0), 0)) - return (ENXIO); -#else /* * A status value of 0xff is very unlikely, but not theoretically * impossible, but it is far more likely to indicate an empty bus. @@ -1911,7 +1700,6 @@ fdc_initial_reset(device_t dev, struct fdc_data *fdc) if (fdc_cmd(fdc, 3, NE7CMD_SPECIFY, NE7_SPEC_1(6, 240), NE7_SPEC_2(31, 0), 0)) return (ENXIO); -#endif /* * Try to identify the chip. @@ -1973,11 +1761,7 @@ fdc_detach(device_t dev) mtx_unlock(&fdc->fdc_mtx); /* reset controller, turn motor off */ -#ifdef PC98 - fdc_reset(fdc); -#else fdout_wr(fdc, 0); -#endif if (!(fdc->flags & FDC_NODMA)) isa_dma_release(fdc->dmachan); @@ -2051,11 +1835,7 @@ fdc_attach(device_t dev) mtx_init(&fdc->fdc_mtx, "fdc lock", NULL, MTX_DEF); /* reset controller, turn motor off, clear fdout mirror reg */ -#ifdef PC98 - fdc_reset(fdc); -#else fdout_wr(fdc, fdc->fdout = 0); -#endif bioq_init(&fdc->head); settle = hz / 8; @@ -2117,10 +1897,8 @@ static int fd_probe(device_t dev) { int unit; -#ifndef PC98 int i; u_int st0, st3; -#endif struct fd_data *fd; struct fdc_data *fdc; int fdsu; @@ -2147,9 +1925,7 @@ fd_probe(device_t dev) fd->type = type; } -#ifdef PC98 - pc98_fd_check_type(fd, unit); -#elif defined(__i386__) || defined(__amd64__) +#if defined(__i386__) || defined(__amd64__) if (fd->type == FDT_NONE && (unit == 0 || unit == 1)) { /* Look up what the BIOS thinks we have. */ if (unit == 0) @@ -2164,7 +1940,6 @@ fd_probe(device_t dev) if (fd->type == FDT_NONE) return (ENXIO); -#ifndef PC98 mtx_lock(&fdc->fdc_mtx); /* select it */ @@ -2214,19 +1989,10 @@ fd_probe(device_t dev) if ((flags & FD_NO_PROBE) == 0 && (st0 & NE7_ST0_EC) != 0) /* no track 0 -> no drive present */ return (ENXIO); -#endif /* PC98 */ done: switch (fd->type) { -#ifdef PC98 - case FDT_144M: - device_set_desc(dev, "1.44M FDD"); - break; - case FDT_12M: - device_set_desc(dev, "1M/640K FDD"); - break; -#else case FDT_12M: device_set_desc(dev, "1200-KB 5.25\" drive"); break; @@ -2242,7 +2008,6 @@ done: case FDT_720K: device_set_desc(dev, "720-KB 3.5\" drive"); break; -#endif default: return (ENXIO); } @@ -2250,9 +2015,6 @@ done: fd->fdc = fdc; fd->fdsu = fdsu; fd->options = 0; -#ifdef PC98 - fd->pc98_trans = 0; -#endif callout_init_mtx(&fd->toffhandle, &fd->fdc->fdc_mtx, 0); /* initialize densities for subdevices */ diff --git a/sys/dev/fdc/fdc_cbus.c b/sys/dev/fdc/fdc_cbus.c deleted file mode 100644 index b03b370375d8..000000000000 --- a/sys/dev/fdc/fdc_cbus.c +++ /dev/null @@ -1,184 +0,0 @@ -/*- - * Copyright (c) 2004 TAKAHASHI Yoshihiro - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions, and the following disclaimer, - * without modification, immediately at the beginning of the file. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#include <sys/param.h> -#include <sys/bio.h> -#include <sys/bus.h> -#include <sys/kernel.h> -#include <sys/lock.h> -#include <sys/module.h> -#include <sys/mutex.h> -#include <sys/rman.h> -#include <sys/systm.h> - -#include <machine/bus.h> - -#include <pc98/cbus/cbus.h> -#include <dev/fdc/fdcvar.h> - -#include <isa/isavar.h> - -static bus_addr_t fdc_iat[] = {0, 2, 4}; - -static int -fdc_cbus_alloc_resources(device_t dev, struct fdc_data *fdc) -{ - struct resource *res; - int i, rid; - - fdc->fdc_dev = dev; - rid = 0; - res = isa_alloc_resourcev(dev, SYS_RES_IOPORT, &rid, fdc_iat, 3, - RF_ACTIVE); - if (res == NULL) { - device_printf(dev, "cannot reserve I/O port range\n"); - return (ENXIO); - } - isa_load_resourcev(res, fdc_iat, 3); - for (i = 0; i < 3; i++) { - fdc->resio[i] = res; - fdc->ridio[i] = rid; - fdc->ioff[i] = i; - fdc->ioh[i] = rman_get_bushandle(res); - } - fdc->iot = rman_get_bustag(res); - - rid = 3; - bus_set_resource(dev, SYS_RES_IOPORT, rid, IO_FDPORT, 1); - res = bus_alloc_resource_any(dev, SYS_RES_IOPORT, &rid, RF_ACTIVE); - if (res == NULL) { - device_printf(dev, "cannot reserve I/O port range\n"); - return (ENXIO); - } - fdc->resio[3] = res; - fdc->ridio[3] = rid; - fdc->ioff[3] = 0; - fdc->ioh[3] = rman_get_bushandle(res); - /* XXX: Reuses fdc->iot */ - - rid = 4; - bus_set_resource(dev, SYS_RES_IOPORT, rid, 0x4be, 1); - res = bus_alloc_resource_any(dev, SYS_RES_IOPORT, &rid, RF_ACTIVE); - if (res == NULL) { - device_printf(dev, "cannot reserve I/O port range\n"); - return (ENXIO); - } - fdc->resio[4] = res; - fdc->ridio[4] = rid; - fdc->ioff[4] = 0; - fdc->ioh[4] = rman_get_bushandle(res); - /* XXX: Reuses fdc->iot */ - - fdc->res_irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &fdc->rid_irq, - RF_ACTIVE); - if (fdc->res_irq == NULL) { - device_printf(dev, "cannot reserve interrupt line\n"); - return (ENXIO); - } - - if ((fdc->flags & FDC_NODMA) == 0) { - fdc->res_drq = bus_alloc_resource_any(dev, SYS_RES_DRQ, - &fdc->rid_drq, RF_ACTIVE); - if (fdc->res_drq == NULL) { - device_printf(dev, "cannot reserve DMA request line\n"); - return (ENXIO); - } - fdc->dmachan = rman_get_start(fdc->res_drq); - } - - return (0); -} - -static int -fdc_cbus_probe(device_t dev) -{ - int error; - struct fdc_data *fdc; - - fdc = device_get_softc(dev); - - /* Check pnp ids */ - if (isa_get_vendorid(dev)) - return (ENXIO); - - /* Attempt to allocate our resources for the duration of the probe */ - error = fdc_cbus_alloc_resources(dev, fdc); - if (error == 0) - error = fdc_initial_reset(dev, fdc); - - fdc_release_resources(fdc); - return (error); -} - -static int -fdc_cbus_attach(device_t dev) -{ - struct fdc_data *fdc; - int error; - - fdc = device_get_softc(dev); - error = fdc_cbus_alloc_resources(dev, fdc); - if (error == 0) - error = fdc_attach(dev); - if (error == 0) - error = fdc_hints_probe(dev); - if (error == 0) - fdc_start_worker(dev); - else - fdc_release_resources(fdc); - return (error); -} - -static device_method_t fdc_methods[] = { - /* Device interface */ - DEVMETHOD(device_probe, fdc_cbus_probe), - DEVMETHOD(device_attach, fdc_cbus_attach), - DEVMETHOD(device_detach, fdc_detach), - DEVMETHOD(device_shutdown, bus_generic_shutdown), - DEVMETHOD(device_suspend, bus_generic_suspend), - DEVMETHOD(device_resume, bus_generic_resume), - - /* Bus interface */ - DEVMETHOD(bus_print_child, fdc_print_child), - DEVMETHOD(bus_read_ivar, fdc_read_ivar), - DEVMETHOD(bus_write_ivar, fdc_write_ivar), - /* Our children never use any other bus interface methods. */ - - { 0, 0 } -}; - -static driver_t fdc_driver = { - "fdc", - fdc_methods, - sizeof(struct fdc_data) -}; - -DRIVER_MODULE(fdc, isa, fdc_driver, fdc_devclass, 0, 0); diff --git a/sys/dev/fdc/fdcvar.h b/sys/dev/fdc/fdcvar.h index edaef7959de2..082990115135 100644 --- a/sys/dev/fdc/fdcvar.h +++ b/sys/dev/fdc/fdcvar.h @@ -49,9 +49,7 @@ struct fdc_data { #define FDC_KTHREAD_ALIVE 0x2000 /* worker thread is alive */ struct fd_data *fd; /* The active drive */ int retry; -#ifndef PC98 int fdout; /* mirror of the w/o digital output reg */ -#endif u_int status[7]; /* copy of the registers */ enum fdc_type fdct; /* chip version of FDC */ int fdc_errs; /* number of logged errors */ diff --git a/sys/dev/fe/if_fe.c b/sys/dev/fe/if_fe.c index 28841b783777..e4a46011a9a3 100644 --- a/sys/dev/fe/if_fe.c +++ b/sys/dev/fe/if_fe.c @@ -37,14 +37,6 @@ __FBSDID("$FreeBSD$"); * other types of Ethernet cards, but the author is not sure whether * they are useful. * - * This version also includes some alignments to support RE1000, - * C-NET(98)P2 and so on. These cards are not for AT-compatibles, - * but for NEC PC-98 bus -- a proprietary bus architecture available - * only in Japan. Confusingly, it is different from the Microsoft's - * PC98 architecture. :-{ - * Further work for PC-98 version will be available as a part of - * FreeBSD(98) project. - * * This software is a derivative work of if_ed.c version 1.56 by David * Greenman available as a part of FreeBSD 2.0 RELEASE source distribution. * @@ -61,7 +53,6 @@ __FBSDID("$FreeBSD$"); /* * TODO: * o To support ISA PnP auto configuration for FMV-183/184. - * o To support REX-9886/87(PC-98 only). * o To reconsider mbuf usage. * o To reconsider transmission buffer usage, including * transmission buffer size (currently 4KB x 2) and pros-and- diff --git a/sys/dev/fe/if_fe_cbus.c b/sys/dev/fe/if_fe_cbus.c deleted file mode 100644 index c083cdda87a1..000000000000 --- a/sys/dev/fe/if_fe_cbus.c +++ /dev/null @@ -1,1020 +0,0 @@ -/*- - * All Rights Reserved, Copyright (C) Fujitsu Limited 1995 - * - * This software may be used, modified, copied, distributed, and sold, in - * both source and binary form provided that the above copyright, these - * terms and the following disclaimer are retained. The name of the author - * and/or the contributor may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND THE CONTRIBUTOR ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR THE CONTRIBUTOR BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION. - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#include <sys/param.h> -#include <sys/systm.h> -#include <sys/kernel.h> -#include <sys/socket.h> -#include <sys/module.h> - -#include <sys/bus.h> -#include <machine/bus.h> -#include <sys/rman.h> - -#include <net/ethernet.h> -#include <net/if.h> -#include <net/if_mib.h> -#include <net/if_media.h> - -#include <netinet/in.h> -#include <netinet/if_ether.h> - -#include <dev/fe/mb86960.h> -#include <dev/fe/if_fereg.h> -#include <dev/fe/if_fevar.h> - -#include <isa/isavar.h> - -/* - * Cbus specific code. - */ -static int fe_isa_probe(device_t); -static int fe_isa_attach(device_t); - -static struct isa_pnp_id fe_ids[] = { - { 0x101ee0d, NULL }, /* CON0101 - Contec C-NET(98)P2-T */ - { 0, NULL } -}; - -static device_method_t fe_isa_methods[] = { - /* Device interface */ - DEVMETHOD(device_probe, fe_isa_probe), - DEVMETHOD(device_attach, fe_isa_attach), - - { 0, 0 } -}; - -static driver_t fe_isa_driver = { - "fe", - fe_isa_methods, - sizeof (struct fe_softc) -}; - -DRIVER_MODULE(fe, isa, fe_isa_driver, fe_devclass, 0, 0); - - -static int fe98_alloc_port(device_t, int); - -static int fe_probe_re1000(device_t); -static int fe_probe_cnet9ne(device_t); -static int fe_probe_rex(device_t); -static int fe_probe_ssi(device_t); -static int fe_probe_jli(device_t); -static int fe_probe_lnx(device_t); -static int fe_probe_gwy(device_t); -static int fe_probe_ubn(device_t); - -/* - * Determine if the device is present at a specified I/O address. The - * main entry to the driver. - */ -static int -fe_isa_probe(device_t dev) -{ - struct fe_softc *sc; - int error; - - /* Prepare for the softc struct. */ - sc = device_get_softc(dev); - sc->sc_unit = device_get_unit(dev); - - /* Check isapnp ids */ - error = ISA_PNP_PROBE(device_get_parent(dev), dev, fe_ids); - - /* If the card had a PnP ID that didn't match any we know about */ - if (error == ENXIO) - goto end; - - /* If we had some other problem. */ - if (!(error == 0 || error == ENOENT)) - goto end; - - /* Probe for supported boards. */ - if ((error = fe_probe_re1000(dev)) == 0) - goto end; - fe_release_resource(dev); - - if ((error = fe_probe_cnet9ne(dev)) == 0) - goto end; - fe_release_resource(dev); - - if ((error = fe_probe_rex(dev)) == 0) - goto end; - fe_release_resource(dev); - - if ((error = fe_probe_ssi(dev)) == 0) - goto end; - fe_release_resource(dev); - - if ((error = fe_probe_jli(dev)) == 0) - goto end; - fe_release_resource(dev); - - if ((error = fe_probe_lnx(dev)) == 0) - goto end; - fe_release_resource(dev); - - if ((error = fe_probe_ubn(dev)) == 0) - goto end; - fe_release_resource(dev); - - if ((error = fe_probe_gwy(dev)) == 0) - goto end; - fe_release_resource(dev); - -end: - if (error == 0) - error = fe_alloc_irq(dev, 0); - - fe_release_resource(dev); - return (error); -} - -static int -fe_isa_attach(device_t dev) -{ - struct fe_softc *sc = device_get_softc(dev); - int error = 0; - - /* - * Note: these routines aren't expected to fail since we also call - * them in the probe routine. But coverity complains, so we'll honor - * that complaint since the intention here was never to ignore them.. - */ - if (sc->port_used) { - error = fe98_alloc_port(dev, sc->type); - if (error != 0) - return (error); - } - error = fe_alloc_irq(dev, 0); - if (error != 0) - return (error); - - return fe_attach(dev); -} - - -/* Generic I/O address table */ -static bus_addr_t ioaddr_generic[MAXREGISTERS] = { - 0x000, 0x001, 0x002, 0x003, 0x004, 0x005, 0x006, 0x007, - 0x008, 0x009, 0x00a, 0x00b, 0x00c, 0x00d, 0x00e, 0x00f, - 0x010, 0x011, 0x012, 0x013, 0x014, 0x015, 0x016, 0x017, - 0x018, 0x019, 0x01a, 0x01b, 0x01c, 0x01d, 0x01e, 0x01f, -}; - -/* I/O address table for RE1000/1000Plus */ -static bus_addr_t ioaddr_re1000[MAXREGISTERS] = { - 0x0000, 0x0001, 0x0200, 0x0201, 0x0400, 0x0401, 0x0600, 0x0601, - 0x0800, 0x0801, 0x0a00, 0x0a01, 0x0c00, 0x0c01, 0x0e00, 0x0e01, - 0x1000, 0x1200, 0x1400, 0x1600, 0x1800, 0x1a00, 0x1c00, 0x1e00, - 0x1001, 0x1201, 0x1401, 0x1601, 0x1801, 0x1a01, 0x1c01, 0x1e01, -}; - -/* I/O address table for CNET9NE */ -static bus_addr_t ioaddr_cnet9ne[MAXREGISTERS] = { - 0x000, 0x001, 0x002, 0x003, 0x004, 0x005, 0x006, 0x007, - 0x008, 0x009, 0x00a, 0x00b, 0x00c, 0x00d, 0x00e, 0x00f, - 0x400, 0x402, 0x404, 0x406, 0x408, 0x40a, 0x40c, 0x40e, - 0x401, 0x403, 0x405, 0x407, 0x409, 0x40b, 0x40d, 0x40f, -}; - -/* I/O address table for LAC-98 */ -static bus_addr_t ioaddr_lnx[MAXREGISTERS] = { - 0x000, 0x002, 0x004, 0x006, 0x008, 0x00a, 0x00c, 0x00e, - 0x100, 0x102, 0x104, 0x106, 0x108, 0x10a, 0x10c, 0x10e, - 0x200, 0x202, 0x204, 0x206, 0x208, 0x20a, 0x20c, 0x20e, - 0x300, 0x302, 0x304, 0x306, 0x308, 0x30a, 0x30c, 0x30e, -}; - -/* I/O address table for Access/PC N98C+ */ -static bus_addr_t ioaddr_ubn[MAXREGISTERS] = { - 0x000, 0x001, 0x002, 0x003, 0x004, 0x005, 0x006, 0x007, - 0x008, 0x009, 0x00a, 0x00b, 0x00c, 0x00d, 0x00e, 0x00f, - 0x200, 0x201, 0x202, 0x203, 0x204, 0x205, 0x206, 0x207, - 0x208, 0x209, 0x20a, 0x20b, 0x20c, 0x20d, 0x20e, 0x20f, -}; - -/* I/O address table for REX-9880 */ -static bus_addr_t ioaddr_rex[MAXREGISTERS] = { - 0x000, 0x001, 0x002, 0x003, 0x004, 0x005, 0x006, 0x007, - 0x008, 0x009, 0x00a, 0x00b, 0x00c, 0x00d, 0x00e, 0x00f, - 0x100, 0x101, 0x102, 0x103, 0x104, 0x105, 0x106, 0x107, - 0x108, 0x109, 0x10a, 0x10b, 0x10c, 0x10d, 0x10e, 0x10f, -}; - -static int -fe98_alloc_port(device_t dev, int type) -{ - struct fe_softc *sc = device_get_softc(dev); - struct resource *res; - bus_addr_t *iat; - int size, rid; - - switch (type) { - case FE_TYPE_RE1000: - iat = ioaddr_re1000; - size = MAXREGISTERS; - break; - case FE_TYPE_CNET9NE: - iat = ioaddr_cnet9ne; - size = MAXREGISTERS; - break; - case FE_TYPE_SSI: - iat = ioaddr_generic; - size = MAXREGISTERS; - break; - case FE_TYPE_LNX: - iat = ioaddr_lnx; - size = MAXREGISTERS; - break; - case FE_TYPE_GWY: - iat = ioaddr_generic; - size = MAXREGISTERS; - break; - case FE_TYPE_UBN: - iat = ioaddr_ubn; - size = MAXREGISTERS; - break; - case FE_TYPE_REX: - iat = ioaddr_rex; - size = MAXREGISTERS; - break; - default: - iat = ioaddr_generic; - size = MAXREGISTERS; - break; - } - - rid = 0; - res = isa_alloc_resourcev(dev, SYS_RES_IOPORT, &rid, - iat, size, RF_ACTIVE); - if (res == NULL) - return ENOENT; - - isa_load_resourcev(res, iat, size); - - sc->type = type; - sc->port_used = size; - sc->port_res = res; - return (0); -} - - -/* - * Probe and initialization for Allied-Telesis RE1000 series. - */ -static void -fe_init_re1000(struct fe_softc *sc) -{ - /* Setup IRQ control register on the ASIC. */ - fe_outb(sc, FE_RE1000_IRQCONF, sc->priv_info); -} - -static int -fe_probe_re1000(device_t dev) -{ - struct fe_softc *sc = device_get_softc(dev); - int i, n; - rman_res_t iobase, irq; - u_char sum; - - static struct fe_simple_probe_struct probe_table [] = { - { FE_DLCR2, 0x58, 0x00 }, - { FE_DLCR4, 0x08, 0x00 }, - { 0 } - }; - - /* See if the specified I/O address is possible for RE1000. */ - /* [01]D[02468ACE] are allowed. */ - if (bus_get_resource(dev, SYS_RES_IOPORT, 0, &iobase, NULL) != 0) - return ENXIO; - if ((iobase & ~0x10E) != 0xD0) - return ENXIO; - - if (fe98_alloc_port(dev, FE_TYPE_RE1000)) - return ENXIO; - - /* Fill the softc struct with default values. */ - fe_softc_defaults(sc); - - /* See if the card is on its address. */ - if (!fe_simple_probe(sc, probe_table)) - return ENXIO; - - /* Get our station address from EEPROM. */ - fe_inblk(sc, 0x18, sc->enaddr, ETHER_ADDR_LEN); - - /* Make sure it is Allied-Telesis's. */ - if (!fe_valid_Ether_p(sc->enaddr, 0x0000F4)) - return ENXIO; -#if 1 - /* Calculate checksum. */ - sum = fe_inb(sc, 0x1e); - for (i = 0; i < ETHER_ADDR_LEN; i++) - sum ^= sc->enaddr[i]; - if (sum != 0) - return ENXIO; -#endif - /* Setup the board type. */ - sc->typestr = "RE1000"; - - /* This looks like an RE1000 board. It requires an - explicit IRQ setting in config. Make sure we have one, - determining an appropriate value for the IRQ control - register. */ - irq = 0; - bus_get_resource(dev, SYS_RES_IRQ, 0, &irq, NULL); - switch (irq) { - case 3: n = 0x10; break; - case 5: n = 0x20; break; - case 6: n = 0x40; break; - case 12: n = 0x80; break; - default: - fe_irq_failure(sc->typestr, sc->sc_unit, irq, "3/5/6/12"); - return ENXIO; - } - sc->priv_info = (fe_inb(sc, FE_RE1000_IRQCONF) & 0x0f) | n; - - /* Setup hooks. We need a special initialization procedure. */ - sc->init = fe_init_re1000; - - return 0; -} - -/* JLI sub-probe for Allied-Telesis RE1000Plus/ME1500 series. */ -static u_short const * -fe_probe_jli_re1000p(struct fe_softc * sc, u_char const * eeprom) -{ - int i; - static u_short const irqmaps_re1000p [4] = { 3, 5, 6, 12 }; - - /* Make sure the EEPROM contains Allied-Telesis bit pattern. */ - if (eeprom[1] != 0xFF) return NULL; - for (i = 2; i < 8; i++) if (eeprom[i] != 0xFF) return NULL; - for (i = 14; i < 24; i++) if (eeprom[i] != 0xFF) return NULL; - - /* Get our station address from EEPROM, and make sure the - EEPROM contains Allied-Telesis's address. */ - bcopy(eeprom + 8, sc->enaddr, ETHER_ADDR_LEN); - if (!fe_valid_Ether_p(sc->enaddr, 0x0000F4)) - return NULL; - - /* I don't know any sub-model identification. */ - sc->typestr = "RE1000Plus/ME1500"; - - /* Returns the IRQ table for the RE1000Plus. */ - return irqmaps_re1000p; -} - - -/* - * Probe for Allied-Telesis RE1000Plus/ME1500 series. - */ -static int -fe_probe_jli(device_t dev) -{ - struct fe_softc *sc = device_get_softc(dev); - int i, n, xirq, error; - rman_res_t iobase, irq; - u_char eeprom [JLI_EEPROM_SIZE]; - u_short const * irqmap; - - static u_short const baseaddr [8] = - { 0x1D6, 0x1D8, 0x1DA, 0x1D4, 0x0D4, 0x0D2, 0x0D8, 0x0D0 }; - static struct fe_simple_probe_struct const probe_table [] = { - /* { FE_DLCR1, 0x20, 0x00 }, Doesn't work. */ - { FE_DLCR2, 0x50, 0x00 }, - { FE_DLCR4, 0x08, 0x00 }, - /* { FE_DLCR5, 0x80, 0x00 }, Doesn't work. */ -#if 0 - { FE_BMPR16, 0x1B, 0x00 }, - { FE_BMPR17, 0x7F, 0x00 }, -#endif - { 0 } - }; - - /* - * See if the specified address is possible for MB86965A JLI mode. - */ - if (bus_get_resource(dev, SYS_RES_IOPORT, 0, &iobase, NULL) != 0) - return ENXIO; - for (i = 0; i < 8; i++) { - if (baseaddr[i] == iobase) - break; - } - if (i == 8) - return ENXIO; - - if (fe98_alloc_port(dev, FE_TYPE_RE1000)) - return ENXIO; - - /* Fill the softc struct with default values. */ - fe_softc_defaults(sc); - - /* - * We should test if MB86965A is on the base address now. - * Unfortunately, it is very hard to probe it reliably, since - * we have no way to reset the chip under software control. - * On cold boot, we could check the "signature" bit patterns - * described in the Fujitsu document. On warm boot, however, - * we can predict almost nothing about register values. - */ - if (!fe_simple_probe(sc, probe_table)) - return ENXIO; - - /* Check if our I/O address matches config info on 86965. */ - n = (fe_inb(sc, FE_BMPR19) & FE_B19_ADDR) >> FE_B19_ADDR_SHIFT; - if (baseaddr[n] != iobase) - return ENXIO; - - /* - * We are now almost sure we have an MB86965 at the given - * address. So, read EEPROM through it. We have to write - * into LSI registers to read from EEPROM. I want to avoid it - * at this stage, but I cannot test the presence of the chip - * any further without reading EEPROM. FIXME. - */ - fe_read_eeprom_jli(sc, eeprom); - - /* Make sure that config info in EEPROM and 86965 agree. */ - if (eeprom[FE_EEPROM_CONF] != fe_inb(sc, FE_BMPR19)) - return ENXIO; - - /* Use 86965 media selection scheme, unless othewise - specified. It is "AUTO always" and "select with BMPR13". - This behaviour covers most of the 86965 based board (as - minimum requirements.) It is backward compatible with - previous versions, also. */ - sc->mbitmap = MB_HA; - sc->defmedia = MB_HA; - sc->msel = fe_msel_965; - - /* Perform board-specific probe. */ - if ((irqmap = fe_probe_jli_re1000p(sc, eeprom)) == NULL) - return ENXIO; - - /* Find the IRQ read from EEPROM. */ - n = (fe_inb(sc, FE_BMPR19) & FE_B19_IRQ) >> FE_B19_IRQ_SHIFT; - xirq = irqmap[n]; - - /* Try to determine IRQ setting. */ - error = bus_get_resource(dev, SYS_RES_IRQ, 0, &irq, NULL); - if (error && xirq == NO_IRQ) { - /* The device must be configured with an explicit IRQ. */ - device_printf(dev, "IRQ auto-detection does not work\n"); - return ENXIO; - } else if (error && xirq != NO_IRQ) { - /* Just use the probed IRQ value. */ - bus_set_resource(dev, SYS_RES_IRQ, 0, xirq, 1); - } else if (!error && xirq == NO_IRQ) { - /* No problem. Go ahead. */ - } else if (irq == xirq) { - /* Good. Go ahead. */ - } else { - /* User must be warned in this case. */ - sc->stability |= UNSTABLE_IRQ; - } - - /* Setup a hook, which resets te 86965 when the driver is being - initialized. This may solve a nasty bug. FIXME. */ - sc->init = fe_init_jli; - - return 0; -} - - -/* - * Probe and initialization for Contec C-NET(9N)E series. - */ - -/* TODO: Should be in "if_fereg.h" */ -#define FE_CNET9NE_INTR 0x10 /* Interrupt Mask? */ - -static void -fe_init_cnet9ne(struct fe_softc *sc) -{ - /* Enable interrupt? FIXME. */ - fe_outb(sc, FE_CNET9NE_INTR, 0x10); -} - -static int -fe_probe_cnet9ne (device_t dev) -{ - struct fe_softc *sc = device_get_softc(dev); - rman_res_t iobase, irq; - - static struct fe_simple_probe_struct probe_table [] = { - { FE_DLCR2, 0x58, 0x00 }, - { FE_DLCR4, 0x08, 0x00 }, - { 0 } - }; - - /* See if the specified I/O address is possible for C-NET(9N)E. */ - if (bus_get_resource(dev, SYS_RES_IOPORT, 0, &iobase, NULL) != 0) - return ENXIO; - if (iobase != 0x73D0) - return ENXIO; - - if (fe98_alloc_port(dev, FE_TYPE_CNET9NE)) - return ENXIO; - - /* Fill the softc struct with default values. */ - fe_softc_defaults(sc); - - /* See if the card is on its address. */ - if (!fe_simple_probe(sc, probe_table)) - return ENXIO; - - /* Get our station address from EEPROM. */ - fe_inblk(sc, 0x18, sc->enaddr, ETHER_ADDR_LEN); - - /* Make sure it is Contec's. */ - if (!fe_valid_Ether_p(sc->enaddr, 0x00804C)) - return ENXIO; - - /* Determine the card type. */ - if (sc->enaddr[3] == 0x06) { - sc->typestr = "C-NET(9N)C"; - - /* We seems to need our own IDENT bits... FIXME. */ - sc->proto_dlcr7 = FE_D7_BYTSWP_LH | FE_D7_IDENT_NICE; - - /* C-NET(9N)C requires an explicit IRQ to work. */ - if (bus_get_resource(dev, SYS_RES_IRQ, 0, &irq, NULL) != 0) { - fe_irq_failure(sc->typestr, sc->sc_unit, NO_IRQ, NULL); - return ENXIO; - } - } else { - sc->typestr = "C-NET(9N)E"; - - /* C-NET(9N)E works only IRQ5. */ - if (bus_get_resource(dev, SYS_RES_IRQ, 0, &irq, NULL) != 0) - return ENXIO; - if (irq != 5) { - fe_irq_failure(sc->typestr, sc->sc_unit, irq, "5"); - return ENXIO; - } - - /* We need an init hook to initialize ASIC before we start. */ - sc->init = fe_init_cnet9ne; - } - - /* C-NET(9N)E has 64KB SRAM. */ - sc->proto_dlcr6 = FE_D6_BUFSIZ_64KB | FE_D6_TXBSIZ_2x4KB - | FE_D6_BBW_WORD | FE_D6_SBW_WORD | FE_D6_SRAM; - - return 0; -} - - -/* - * Probe for Contec C-NET(98)P2 series. - * (Logitec LAN-98TP/LAN-98T25P - parhaps) - */ -static int -fe_probe_ssi(device_t dev) -{ - struct fe_softc *sc = device_get_softc(dev); - rman_res_t iobase, irq; - - u_char eeprom [SSI_EEPROM_SIZE]; - static struct fe_simple_probe_struct probe_table [] = { - { FE_DLCR2, 0x08, 0x00 }, - { FE_DLCR4, 0x08, 0x00 }, - { 0 } - }; - static u_short const irqmap[] = { - /* INT0 INT1 INT2 */ - NO_IRQ, NO_IRQ, NO_IRQ, 3, NO_IRQ, 5, 6, NO_IRQ, - NO_IRQ, 9, 10, NO_IRQ, 12, 13, NO_IRQ, NO_IRQ, - /* INT3 INT41 INT5 INT6 */ - }; - - /* See if the specified I/O address is possible for 78Q8377A. */ - /* [0-D]3D0 are allowed. */ - if (bus_get_resource(dev, SYS_RES_IOPORT, 0, &iobase, NULL) != 0) - return ENXIO; - if ((iobase & 0xFFF) != 0x3D0) - return ENXIO; - - if (fe98_alloc_port(dev, FE_TYPE_SSI)) - return ENXIO; - - /* Fill the softc struct with default values. */ - fe_softc_defaults(sc); - - /* See if the card is on its address. */ - if (!fe_simple_probe(sc, probe_table)) - return ENXIO; - - /* We now have to read the config EEPROM. We should be very - careful, since doing so destroys a register. (Remember, we - are not yet sure we have a C-NET(98)P2 board here.) Don't - remember to select BMPRs bofore reading EEPROM, since other - register bank may be selected before the probe() is called. */ - fe_read_eeprom_ssi(sc, eeprom); - - /* Make sure the Ethernet (MAC) station address is of Contec's. */ - if (!fe_valid_Ether_p(eeprom + FE_SSI_EEP_ADDR, 0x00804C)) - return ENXIO; - bcopy(eeprom + FE_SSI_EEP_ADDR, sc->enaddr, ETHER_ADDR_LEN); - - /* Setup the board type. */ - sc->typestr = "C-NET(98)P2"; - - /* Non-PnP mode, set static resource from eeprom. */ - if (!isa_get_vendorid(dev)) { - /* Get IRQ configuration from EEPROM. */ - irq = irqmap[eeprom[FE_SSI_EEP_IRQ]]; - if (irq == NO_IRQ) { - fe_irq_failure(sc->typestr, sc->sc_unit, irq, - "3/5/6/9/10/12/13"); - return ENXIO; - } - bus_set_resource(dev, SYS_RES_IRQ, 0, irq, 1); - } - - /* Get Duplex-mode configuration from EEPROM. */ - sc->proto_dlcr4 |= (eeprom[FE_SSI_EEP_DUPLEX] & FE_D4_DSC); - - /* Fill softc struct accordingly. */ - sc->mbitmap = MB_HT; - sc->defmedia = MB_HT; - - return 0; -} - - -/* - * Probe for TDK LAC-98012/013/025/9N011 - parhaps. - */ -static int -fe_probe_lnx(device_t dev) -{ - struct fe_softc *sc = device_get_softc(dev); - - rman_res_t iobase, irq; - u_char eeprom [LNX_EEPROM_SIZE]; - - static struct fe_simple_probe_struct probe_table [] = { - { FE_DLCR2, 0x58, 0x00 }, - { FE_DLCR4, 0x08, 0x00 }, - { 0 } - }; - - /* See if the specified I/O address is possible for TDK/LANX boards. */ - /* 0D0, 4D0, 8D0, and CD0 are allowed. */ - if (bus_get_resource(dev, SYS_RES_IOPORT, 0, &iobase, NULL) != 0) - return ENXIO; - if ((iobase & ~0xC00) != 0xD0) - return ENXIO; - - if (fe98_alloc_port(dev, FE_TYPE_LNX)) - return ENXIO; - - /* Fill the softc struct with default values. */ - fe_softc_defaults(sc); - - /* See if the card is on its address. */ - if (!fe_simple_probe(sc, probe_table)) - return ENXIO; - - /* We now have to read the config EEPROM. We should be very - careful, since doing so destroys a register. (Remember, we - are not yet sure we have a LAC-98012/98013 board here.) */ - fe_read_eeprom_lnx(sc, eeprom); - - /* Make sure the Ethernet (MAC) station address is of TDK/LANX's. */ - if (!fe_valid_Ether_p(eeprom, 0x008098)) - return ENXIO; - bcopy(eeprom, sc->enaddr, ETHER_ADDR_LEN); - - /* Setup the board type. */ - sc->typestr = "LAC-98012/98013"; - - /* This looks like a TDK/LANX board. It requires an - explicit IRQ setting in config. Make sure we have one, - determining an appropriate value for the IRQ control - register. */ - irq = 0; - if (bus_get_resource(dev, SYS_RES_IRQ, 0, &irq, NULL) != 0) - return ENXIO; - switch (irq) { - case 3 : sc->priv_info = 0x10 | LNX_CLK_LO | LNX_SDA_HI; break; - case 5 : sc->priv_info = 0x20 | LNX_CLK_LO | LNX_SDA_HI; break; - case 6 : sc->priv_info = 0x40 | LNX_CLK_LO | LNX_SDA_HI; break; - case 12: sc->priv_info = 0x80 | LNX_CLK_LO | LNX_SDA_HI; break; - default: - fe_irq_failure(sc->typestr, sc->sc_unit, irq, "3/5/6/12"); - return ENXIO; - } - - /* LAC-98's system bus width is 8-bit. */ - sc->proto_dlcr6 = FE_D6_BUFSIZ_32KB | FE_D6_TXBSIZ_2x2KB - | FE_D6_BBW_BYTE | FE_D6_SBW_BYTE | FE_D6_SRAM_150ns; - - /* Setup hooks. We need a special initialization procedure. */ - sc->init = fe_init_lnx; - - return 0; -} - - -/* - * Probe for Gateway Communications' old cards. - * (both as Generic MB86960 probe routine) - */ -static int -fe_probe_gwy(device_t dev) -{ - struct fe_softc *sc = device_get_softc(dev); - - static struct fe_simple_probe_struct probe_table [] = { - /* { FE_DLCR2, 0x70, 0x00 }, */ - { FE_DLCR2, 0x58, 0x00 }, - { FE_DLCR4, 0x08, 0x00 }, - { 0 } - }; - - /* - * XXX - * I'm not sure which address is possible, so accepts any. - */ - - if (fe98_alloc_port(dev, FE_TYPE_GWY)) - return ENXIO; - - /* Fill the softc struct with default values. */ - fe_softc_defaults(sc); - - /* See if the card is on its address. */ - if (!fe_simple_probe(sc, probe_table)) - return ENXIO; - - /* Get our station address from EEPROM. */ - fe_inblk(sc, 0x18, sc->enaddr, ETHER_ADDR_LEN); - if (!fe_valid_Ether_p(sc->enaddr, 0x000000)) - return ENXIO; - - /* Determine the card type. */ - sc->typestr = "Generic MB86960 Ethernet"; - if (fe_valid_Ether_p(sc->enaddr, 0x000061)) - sc->typestr = "Gateway Ethernet (Fujitsu chipset)"; - - /* Gateway's board requires an explicit IRQ to work, since it - is not possible to probe the setting of jumpers. */ - if (bus_get_resource(dev, SYS_RES_IRQ, 0, NULL, NULL) != 0) { - fe_irq_failure(sc->typestr, sc->sc_unit, NO_IRQ, NULL); - return ENXIO; - } - - return 0; -} - - -/* - * Probe for Ungermann-Bass Access/PC N98C+(Model 85152). - */ -static int -fe_probe_ubn(device_t dev) -{ - struct fe_softc *sc = device_get_softc(dev); - - u_char sum, save7; - rman_res_t iobase, irq; - int i; - static struct fe_simple_probe_struct const probe_table [] = { - { FE_DLCR2, 0x58, 0x00 }, - { FE_DLCR4, 0x08, 0x00 }, - { 0 } - }; - - /* See if the specified I/O address is possible for Access/PC. */ - /* [01][048C]D0 are allowed. */ - if (bus_get_resource(dev, SYS_RES_IOPORT, 0, &iobase, NULL) != 0) - return ENXIO; - if ((iobase & ~0x1C00) != 0xD0) - return ENXIO; - - if (fe98_alloc_port(dev, FE_TYPE_UBN)) - return ENXIO; - - /* Fill the softc struct with default values. */ - fe_softc_defaults(sc); - - /* Simple probe. */ - if (!fe_simple_probe(sc, probe_table)) - return ENXIO; - - /* NOTE: Access/NOTE N98 sometimes freeze when reading station - address. In case of using it togather with C-NET(9N)C, - this problem usually happens. - Writing DLCR7 prevents freezing, but I don't know why. FIXME. */ - - /* Save the current value for the DLCR7 register we are about - to destroy. */ - save7 = fe_inb(sc, FE_DLCR7); - fe_outb(sc, FE_DLCR7, - sc->proto_dlcr7 | FE_D7_RBS_BMPR | FE_D7_POWER_UP); - - /* Get our station address form ID ROM and make sure it is UBN's. */ - fe_inblk(sc, 0x18, sc->enaddr, ETHER_ADDR_LEN); - if (!fe_valid_Ether_p(sc->enaddr, 0x00DD01)) - goto fail_ubn; -#if 1 - /* Calculate checksum. */ - sum = fe_inb(sc, 0x1e); - for (i = 0; i < ETHER_ADDR_LEN; i++) - sum ^= sc->enaddr[i]; - if (sum != 0) - goto fail_ubn; -#endif - - /* Setup the board type. */ - sc->typestr = "Access/PC"; - - /* This looks like an AccessPC/N98C+ board. It requires an - explicit IRQ setting in config. Make sure we have one, - determining an appropriate value for the IRQ control - register. */ - irq = 0; - bus_get_resource(dev, SYS_RES_IRQ, 0, &irq, NULL); - switch (irq) { - case 3: sc->priv_info = 0x01; break; - case 5: sc->priv_info = 0x02; break; - case 6: sc->priv_info = 0x04; break; - case 12: sc->priv_info = 0x08; break; - default: - fe_irq_failure(sc->typestr, sc->sc_unit, irq, "3/5/6/12"); - goto fail_ubn; - } - - /* Setup hooks. We need a special initialization procedure. */ - sc->init = fe_init_ubn; - - return 0; - -fail_ubn: - fe_outb(sc, FE_DLCR7, save7); - return ENXIO; -} - - -/* - * REX boards(non-JLI type) support routine. - */ - -#define REX_EEPROM_SIZE 32 -#define REX_DAT 0x01 - -static void -fe_read_eeprom_rex(struct fe_softc *sc, u_char *data) -{ - int i; - u_char bit, val; - u_char save16; - - save16 = fe_inb(sc, 0x10); - - /* Issue a start condition. */ - val = fe_inb(sc, 0x10) & 0xf0; - fe_outb(sc, 0x10, val); - - (void) fe_inb(sc, 0x10); - (void) fe_inb(sc, 0x10); - (void) fe_inb(sc, 0x10); - (void) fe_inb(sc, 0x10); - - /* Read bytes from EEPROM. */ - for (i = 0; i < REX_EEPROM_SIZE; i++) { - /* Read a byte and store it into the buffer. */ - val = 0x00; - for (bit = 0x01; bit != 0x00; bit <<= 1) - if (fe_inb(sc, 0x10) & REX_DAT) - val |= bit; - *data++ = val; - } - - fe_outb(sc, 0x10, save16); - -#if 1 - /* Report what we got. */ - if (bootverbose) { - data -= REX_EEPROM_SIZE; - for (i = 0; i < REX_EEPROM_SIZE; i += 16) { - printf("fe%d: EEPROM(REX):%3x: %16D\n", - sc->sc_unit, i, data + i, " "); - } - } -#endif -} - - -static void -fe_init_rex(struct fe_softc *sc) -{ - /* Setup IRQ control register on the ASIC. */ - fe_outb(sc, 0x10, sc->priv_info); -} - -/* - * Probe for RATOC REX-9880/81/82/83 series. - */ -static int -fe_probe_rex(device_t dev) -{ - struct fe_softc *sc = device_get_softc(dev); - - int i; - rman_res_t iobase, irq; - u_char eeprom [REX_EEPROM_SIZE]; - - static struct fe_simple_probe_struct probe_table [] = { - { FE_DLCR2, 0x58, 0x00 }, - { FE_DLCR4, 0x08, 0x00 }, - { 0 } - }; - - /* See if the specified I/O address is possible for REX-9880. */ - /* 6[46CE]D0 are allowed. */ - if (bus_get_resource(dev, SYS_RES_IOPORT, 0, &iobase, NULL) != 0) - return ENXIO; - if ((iobase & ~0xA00) != 0x64D0) - return ENXIO; - - if (fe98_alloc_port(dev, FE_TYPE_REX)) - return ENXIO; - - /* Fill the softc struct with default values. */ - fe_softc_defaults(sc); - - /* See if the card is on its address. */ - if (!fe_simple_probe(sc, probe_table)) - return ENXIO; - - /* We now have to read the config EEPROM. We should be very - careful, since doing so destroys a register. (Remember, we - are not yet sure we have a REX-9880 board here.) */ - fe_read_eeprom_rex(sc, eeprom); - for (i = 0; i < ETHER_ADDR_LEN; i++) - sc->enaddr[i] = eeprom[7 - i]; - - /* Make sure it is RATOC's. */ - if (!fe_valid_Ether_p(sc->enaddr, 0x00C0D0) && - !fe_valid_Ether_p(sc->enaddr, 0x00803D)) - return 0; - - /* Setup the board type. */ - sc->typestr = "REX-9880/9883"; - - /* This looks like a REX-9880 board. It requires an - explicit IRQ setting in config. Make sure we have one, - determining an appropriate value for the IRQ control - register. */ - irq = 0; - bus_get_resource(dev, SYS_RES_IRQ, 0, &irq, NULL); - switch (irq) { - case 3: sc->priv_info = 0x10; break; - case 5: sc->priv_info = 0x20; break; - case 6: sc->priv_info = 0x40; break; - case 12: sc->priv_info = 0x80; break; - default: - fe_irq_failure(sc->typestr, sc->sc_unit, irq, "3/5/6/12"); - return ENXIO; - } - - /* Setup hooks. We need a special initialization procedure. */ - sc->init = fe_init_rex; - - /* REX-9880 has 64KB SRAM. */ - sc->proto_dlcr6 = FE_D6_BUFSIZ_64KB | FE_D6_TXBSIZ_2x4KB - | FE_D6_BBW_WORD | FE_D6_SBW_WORD | FE_D6_SRAM; -#if 1 - sc->proto_dlcr7 |= FE_D7_EOPPOL; /* XXX */ -#endif - - return 0; -} diff --git a/sys/dev/fe/if_fereg.h b/sys/dev/fe/if_fereg.h index afc9c5704c58..a349f77044b1 100644 --- a/sys/dev/fe/if_fereg.h +++ b/sys/dev/fe/if_fereg.h @@ -114,14 +114,6 @@ /* - * Registers on RE1000. (*NOT* on RE1000 Plus.) - */ - -/* IRQ configuration. */ -#define FE_RE1000_IRQCONF 0x10 - - -/* * Fujitsu MB86965 JLI mode support routines. */ diff --git a/sys/dev/ic/i8251.h b/sys/dev/ic/i8251.h deleted file mode 100644 index 162ab29e9ac9..000000000000 --- a/sys/dev/ic/i8251.h +++ /dev/null @@ -1,111 +0,0 @@ -/*- - * Copyright (c) 1991 The Regents of the University of California. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * $FreeBSD$ - */ - -/* - * modified for PC9801 by M.Ishii - * Kyoto University Microcomputer Club (KMC) - * - * modified for 8251(FIFO) by Seigo TANIMURA <tanimura@FreeBSD.org> - */ - -/* i8251 mode register */ -#define MOD8251_5BITS 0x00 -#define MOD8251_6BITS 0x04 -#define MOD8251_7BITS 0x08 -#define MOD8251_8BITS 0x0c -#define MOD8251_PENAB 0x10 /* parity enable */ -#define MOD8251_PEVEN 0x20 /* parity even */ -#define MOD8251_STOP1 0x40 /* 1 stop bit */ -#define MOD8251_STOP15 0x80 /* 1.5 stop bit */ -#define MOD8251_STOP2 0xc0 /* 2 stop bit */ -#define MOD8251_CLKx1 0x01 /* x1 */ -#define MOD8251_CLKx16 0x02 /* x16 */ -#define MOD8251_CLKx64 0x03 /* x64 */ - -/* i8251 command register */ -#define CMD8251_TxEN 0x01 /* transmit enable */ -#define CMD8251_DTR 0x02 /* assert DTR */ -#define CMD8251_RxEN 0x04 /* receive enable */ -#define CMD8251_SBRK 0x08 /* send break */ -#define CMD8251_ER 0x10 /* error reset */ -#define CMD8251_RTS 0x20 /* assert RTS */ -#define CMD8251_RESET 0x40 /* internal reset */ -#define CMD8251_EH 0x80 /* enter hunt mode */ - -/* i8251 status register */ -#define STS8251_TxRDY 0x01 /* transmit READY */ -#define STS8251_RxRDY 0x02 /* data exists in receive buffer */ -#define STS8251_TxEMP 0x04 /* transmit buffer EMPTY */ -#define STS8251_PE 0x08 /* perity error */ -#define STS8251_OE 0x10 /* overrun error */ -#define STS8251_FE 0x20 /* framing error */ -#define STS8251_BI 0x40 /* break detect */ -#define STS8251_DSR 0x80 /* DSR is asserted */ - -/* i8251F line status register */ -#define FLSR_TxEMP 0x01 /* transmit buffer EMPTY */ -#define FLSR_TxRDY 0x02 /* transmit READY */ -#define FLSR_RxRDY 0x04 /* data exists in receive buffer */ -#define FLSR_OE 0x10 /* overrun error */ -#define FLSR_PE 0x20 /* perity error */ -#define FLSR_BI 0x80 /* break detect */ - -/* i8251F modem status register */ -#define MSR_DCD 0x80 /* Current Data Carrier Detect */ -#define MSR_RI 0x40 /* Current Ring Indicator */ -#define MSR_DSR 0x20 /* Current Data Set Ready */ -#define MSR_CTS 0x10 /* Current Clear to Send */ -#define MSR_DDCD 0x08 /* DCD has changed state */ -#define MSR_TERI 0x04 /* RI has toggled low to high */ -#define MSR_DDSR 0x02 /* DSR has changed state */ -#define MSR_DCTS 0x01 /* CTS has changed state */ - -/* i8251F interrupt identification register */ -#define IIR_FIFO_CK1 0x40 -#define IIR_FIFO_CK2 0x20 -#define IIR_IMASK 0x0f -#define IIR_RXTOUT 0x0c /* Receiver timeout */ -#define IIR_RLS 0x06 /* Line status change */ -#define IIR_RXRDY 0x04 /* Receiver ready */ -#define IIR_TXRDY 0x02 /* Transmitter ready */ -#define IIR_NOPEND 0x01 /* Transmitter ready */ -#define IIR_MLSC 0x00 /* Modem status */ - -/* i8251F fifo control register */ -#define FIFO_ENABLE 0x01 /* Turn the FIFO on */ -#define FIFO_RCV_RST 0x02 /* Reset RX FIFO */ -#define FIFO_XMT_RST 0x04 /* Reset TX FIFO */ -#define FIFO_LSR_EN 0x08 -#define FIFO_MSR_EN 0x10 -#define FIFO_TRIGGER_1 0x00 /* Trigger RXRDY intr on 1 character */ -#define FIFO_TRIGGER_4 0x40 /* ibid 4 */ -#define FIFO_TRIGGER_8 0x80 /* ibid 8 */ -#define FIFO_TRIGGER_14 0xc0 /* ibid 14 */ diff --git a/sys/dev/ic/i8255.h b/sys/dev/ic/i8255.h deleted file mode 100644 index 1ecfe50f5603..000000000000 --- a/sys/dev/ic/i8255.h +++ /dev/null @@ -1,46 +0,0 @@ -/*- - * Copyright (c) 2008 TAKAHASHI Yoshihiro - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * $FreeBSD$ - */ - -#ifndef _DEV_IC_I8255_H_ -#define _DEV_IC_I8255_H_ - -/* - * modem status via SYSTM_PORTB - */ -#define CICSCD_CD 0x20 /* CD */ -#define CICSCD_CS 0x40 /* CS */ -#define CICSCD_CI 0x80 /* CI */ - -/* - * control intrline via SYSTM_PORTC - */ -#define IEN_Rx 0x01 -#define IEN_TxEMP 0x02 -#define IEN_Tx 0x04 - -#endif /* _DEV_IC_I8255_H_ */ diff --git a/sys/dev/ic/rsa.h b/sys/dev/ic/rsa.h deleted file mode 100644 index 6f9376af2f23..000000000000 --- a/sys/dev/ic/rsa.h +++ /dev/null @@ -1,128 +0,0 @@ -/*- - * Copyright (c) 1999 FreeBSD Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * $FreeBSD$ - */ - -/* - * RSA Mode Driver Data Sheet - * - * <<Register Map>> - * Base + 0x00 - * Mode Select Register(Read/Write) - * bit4=interrupt type(1: level, 0: edge) - * bit3=Auto RTS-CTS Flow Control Enable - * bit2=External FIFO Enable - * bit1=Reserved(Default 0)Don't Change!! - * bit0=Swap Upper 8byte and Lower 8byte in 16byte space. - * - * Base + 0x01 - * Interrupt Enable Register(Read/Write) - * bit4=Hardware Timer Interrupt Enable - * bit3=Character Time-Out Interrupt Enable - * bit2=Tx FIFO Empty Interrupt Enable - * bit1=Tx FIFO Half Full Interrupt Enable - * bit0=Rx FIFO Half Full Interrupt Enable - * - * Base + 0x02 - * Status Read Register(Read) - * bit7=Hardware Time Out Interrupt Status(1: True, 0: False) - * bit6=Character Time Out Interrupt Status - * bit5=Rx FIFO Full Flag(0: True, 1: False) - * bit4=Rx FIFO Half Full Flag - * bit3=Rx FIFO Empty Flag - * bit2=Tx FIFO Full Flag - * bit1=Tx FIFO Half Full Flag - * bit0=Tx FIFO Empty Flag - * - * Base + 0x02 - * FIFO Reset Register(Write) - * Reset Extrnal FIFO - * - * Base + 0x03 - * Timer Interval Value Set Register(Read/Write) - * Range of n: 1-255 - * Interval Value: n * 0.2ms - * - * Base + 0x04 - * Timer Control Register(Read/Write) - * bit0=Timer Enable - * - * Base + 0x08 - 0x0f - * Same as UART 16550 - * - * Special Regisgter in RSA Mode - * UART Data Register(Base + 0x08) - * Data transfer between Extrnal FIFO - * - * UART MCR(Base + 0x0c) - * bit3(OUT2[MCR_IENABLE])=1: Diable 16550 to Rx FIFO transfer - * bit2(OUT1[MCR_DRS])=1: Diable Tx FIFO to 16550 transfer - * - * <<Intrrupt and Intrrupt Reset>> - * o Reciver Line Status(from UART16550) - * Reset: Read LSR - * - * o Modem Status(from UART16550) - * Reset: Read MSR - * - * o Rx FIFO Half Full(from Extrnal FIFO) - * Reset: Read Rx FIFO under Hall Full - * - * o Character Time Out(from Extrnal FIFO) - * Reset: Read Rx FIFO or SRR - * - * o Tx FIFO Empty(from Extrnal FIFO) - * Reset: Write Tx FIFO or Read SRR - * - * o Tx FIFO Half Full(from Extrnal FIFO) - * Reset: Write Tx FIFO until Hall Full or Read SRR - * - * o Hardware Timer(from Extrnal FIFO) - * Reset: Disable Timer in TCR - * Notes: If you want to use Timer for next intrrupt, - * you must enable Timer in TCR - * - * <<Used Setting>> - * Auto RTS-CTS: Enable or Disable - * External FIFO: Enable - * Swap 8bytes: Disable - * Haredware Timer: Disable - * interrupt type: edge - * interrupt source: - * Hareware Timer - * Character Time Out - * Tx FIFO Empty - * Rx FIFO Half Full - * - */ - -/* I/O-DATA RSA Serise Exrension Register */ -#define rsa_msr 0 /* Mode Status Register (R/W) */ -#define rsa_ier 1 /* Interrupt Enable Register (R/W) */ -#define rsa_srr 2 /* Status Read Register (R) */ -#define rsa_frr 2 /* FIFO Reset Register (W) */ -#define rsa_tivsr 3 /* Timer Interval Value Set Register (R/W) */ -#define rsa_tcr 4 /* Timer Control Register (W) */ diff --git a/sys/dev/ic/wd33c93reg.h b/sys/dev/ic/wd33c93reg.h deleted file mode 100644 index 8e536cd1d32d..000000000000 --- a/sys/dev/ic/wd33c93reg.h +++ /dev/null @@ -1,165 +0,0 @@ -/* $FreeBSD$ */ -/* $NecBSD: wd33c93reg.h,v 1.21.24.1 2001/06/13 05:52:05 honda Exp $ */ -/* $NetBSD$ */ -/*- - * [NetBSD for NEC PC-98 series] - * Copyright (c) 1996, 1997, 1998 - * NetBSD/pc98 porting staff. All rights reserved. - * Copyright (c) 1996, 1997, 1998 - * Naofumi Honda. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef _WD33C93REG_H_ -#define _WD33C93REG_H_ - -/* wd33c93 register */ -#define wd3s_oid 0x00 -#define IDR_FS_16_20 0x80 -#define IDR_FS_12_15 0x40 -#define IDR_FS_8_10 0x00 -#define IDR_RAF 0x20 -#define IDR_EHP 0x10 -#define IDR_EAF 0x08 -#define IDR_IDM 0x07 - -#define wd3s_ctrl 0x01 -#define CR_DMA 0x80 -#define CR_DMAD 0x40 -#define CR_HLT_HOST_PARITY 0x10 -#define CR_DIS_INT 0x08 -#define CR_IDIS_INT 0x04 -#define CR_HLT_ATN 0x02 -#define CR_HLT_BUS_PARITY 0x01 -#define CR_DEFAULT (CR_DIS_INT | CR_IDIS_INT) -#define CR_DEFAULT_HP (CR_DEFAULT | CR_HLT_BUS_PARITY) - -#define wd3s_tout 0x02 -#define wd3s_cdb 0x03 -#define wd3s_lun 0x0f -#define wd3s_cph 0x10 -#define wd3s_synch 0x11 -#define wd3s_cnt 0x12 -#define wd3s_did 0x15 -#define DIDR_SCC 0x80 -#define DIDR_DPD 0x40 - -#define wd3s_sid 0x16 -#define SIDR_RESEL 0x80 -#define SIDR_SEL 0x40 -#define SIDR_VALID 0x08 -#define SIDR_IDM 0x07 - -#define wd3s_stat 0x17 - -#define BSR_CM 0xf0 -#define BSR_CMDCPL 0x10 -#define BSR_CMDABT 0x20 -#define BSR_CMDERR 0x40 -#define BSR_CMDREQ 0x80 - -#define BSR_SM 0x0f -#define BSR_PM 0x07 -#define BSR_PHVALID 0x08 -#define BSR_IOR 0x01 -#define BSR_DATAOUT 0x00 -#define BSR_DATAIN 0x01 -#define BSR_CMDOUT 0x02 -#define BSR_STATIN 0x03 -#define BSR_UNSPINFO0 0x04 -#define BSR_UNSPINFO1 0x05 -#define BSR_MSGOUT 0x06 -#define BSR_MSGIN 0x07 - -#define BSR_RESET 0x00 -#define BSR_AFM_RESET 0x01 -#define BSR_SELECTED 0x11 -#define BSR_SATFIN 0x16 -#define BSR_ACKREQ 0x20 -#define BSR_SATSDP 0x21 -#define BSR_RESEL 0x80 -#define BSR_AFM_RESEL 0x81 -#define BSR_DISC 0x85 - -#define wd3s_cmd 0x18 -#define wd3s_data 0x19 -#define wd3s_qtag 0x1a - -#define wd3s_mbank 0x30 -#define MBR_RST 0x02 -#define MBR_IEN 0x04 - -#define wd3s_mwin 0x31 -#define wd3s_auxc 0x33 -#define AUXCR_HIDM 0x07 -#define AUXCR_INTM 0x38 -#define AUXCR_RRST 0x80 - -/* status port */ -#define STR_INT 0x80 -#define STR_LCI 0x40 -#define STR_BSY 0x20 -#define STR_CIP 0x10 -#define STR_PE 0x02 -#define STR_DBR 0x01 -#define STR_BUSY 0xf0 - -/* cmd port */ -#define CMDP_DMES 0x01 -#define CMDP_DMER 0x02 -#define CMDP_TCMS 0x04 -#define CMDP_TCMR 0x08 -#define CMDP_TCIR 0x10 - -/* wd33c93 chip cmds */ -#define WD3S_SBT 0x80 -#define WD3S_RESET 0x00 -#define WD3S_ABORT 0x01 -#define WD3S_ASSERT_ATN 0x02 -#define WD3S_NEGATE_ACK 0x03 -#define WD3S_DISCONNECT 0x04 -#define WD3S_RESELECT 0x05 -#define WD3S_SELECT_ATN 0x06 -#define WD3S_SELECT_NO_ATN 0x07 -#define WD3S_SELECT_ATN_TFR 0x08 -#define WD3S_SELECT_NO_ATN_TFR 0x09 -#define WD3S_RESELECT_RCV_DATA 0x0a -#define WD3S_RESELECT_SEND_DATA 0x0b -#define WD3S_WAIT_SELECT_RCV 0x0c -#define WD3S_CMD_COMPSEQ 0x0d -#define WD3S_SEND_DISC_MSG 0x0e -#define WD3S_SET_IDI 0x0f -#define WD3S_RCV_CMD 0x10 -#define WD3S_RCV_DATA 0x11 -#define WD3S_RCV_MSG_OUT 0x12 -#define WD3S_RCV_UNSP_INFO_OUT 0x13 -#define WD3S_SEND_STATUS 0x14 -#define WD3S_SEND_DATA 0x15 -#define WD3S_SEND_MSG_IN 0x16 -#define WD3S_SEND_UNSP_INFO_IN 0x17 -#define WD3S_TRANSLATE_ADDRESS 0x18 -#define WD3S_TFR_INFO 0x20 - -#endif /* !_WD33C93REG_H_ */ diff --git a/sys/dev/kbd/kbd.c b/sys/dev/kbd/kbd.c index 24dc9bbe48ea..2452507002ae 100644 --- a/sys/dev/kbd/kbd.c +++ b/sys/dev/kbd/kbd.c @@ -1327,13 +1327,7 @@ genkbd_keyaction(keyboard_t *kbd, int keycode, int up, int *shiftstate, state &= ~NLKDOWN; break; case CLK: -#ifndef PC98 state &= ~CLKDOWN; -#else - state &= ~CLKED; - i = state & LOCK_MASK; - (void)kbdd_ioctl(kbd, KDSETLED, (caddr_t)&i); -#endif break; case SLK: state &= ~SLKDOWN; @@ -1363,13 +1357,7 @@ genkbd_keyaction(keyboard_t *kbd, int keycode, int up, int *shiftstate, set_lockkey_state(kbd, state, NLK); break; case CLK: -#ifndef PC98 set_lockkey_state(kbd, state, CLK); -#else - state |= CLKED; - i = state & LOCK_MASK; - (void)kbdd_ioctl(kbd, KDSETLED, (caddr_t)&i); -#endif break; case SLK: set_lockkey_state(kbd, state, SLK); diff --git a/sys/dev/le/am79900.c b/sys/dev/le/am79900.c index 5ea82284535c..74f9e5c802f3 100644 --- a/sys/dev/le/am79900.c +++ b/sys/dev/le/am79900.c @@ -254,7 +254,7 @@ am79900_rint(struct lance_softc *sc) struct lermd rmd; uint32_t rmd1; int bix, rp; -#if defined(__i386__) && !defined(PC98) +#if defined(__i386__) struct ether_header *eh; #endif @@ -315,7 +315,7 @@ am79900_rint(struct lance_softc *sc) if (m != NULL) { if_inc_counter(ifp, IFCOUNTER_IPACKETS, 1); -#if defined(__i386__) && !defined(PC98) +#if defined(__i386__) /* * The VMware LANCE does not present IFF_SIMPLEX * behavior on multicast packets. Thus drop the diff --git a/sys/dev/le/if_le_cbus.c b/sys/dev/le/if_le_cbus.c deleted file mode 100644 index 7b493f9f798d..000000000000 --- a/sys/dev/le/if_le_cbus.c +++ /dev/null @@ -1,443 +0,0 @@ -/*- - * Copyright (c) 1994-2000 - * Paul Richards. All rights reserved. - * - * PC-98 port by Chiharu Shibata & FreeBSD(98) porting team. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer, - * verbatim and that no modifications are made prior to this - * point in the file. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name Paul Richards may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY PAUL RICHARDS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL PAUL RICHARDS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * from: FreeBSD: src/sys/dev/lnc/if_lnc_cbus.c,v 1.12 2005/11/12 19:14:21 - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#include <sys/param.h> -#include <sys/systm.h> -#include <sys/bus.h> -#include <sys/endian.h> -#include <sys/kernel.h> -#include <sys/lock.h> -#include <sys/module.h> -#include <sys/mutex.h> -#include <sys/resource.h> -#include <sys/rman.h> -#include <sys/socket.h> - -#include <net/ethernet.h> -#include <net/if.h> -#include <net/if_media.h> - -#include <machine/bus.h> -#include <machine/resource.h> - -#include <isa/isavar.h> - -#include <dev/le/lancereg.h> -#include <dev/le/lancevar.h> -#include <dev/le/am7990var.h> - -#define LE_CBUS_MEMSIZE (16*1024) -#define CNET98S_IOSIZE 32 -#define CNET98S_RDP 0x10 -#define CNET98S_RAP 0x12 -#define CNET98S_RESET 0x14 -#define CNET98S_BDP 0x16 - -struct le_cbus_softc { - struct am7990_softc sc_am7990; /* glue to MI code */ - - struct resource *sc_rres; - - struct resource *sc_ires; - void *sc_ih; - - bus_dma_tag_t sc_pdmat; - bus_dma_tag_t sc_dmat; - bus_dmamap_t sc_dmam; -}; - -static device_probe_t le_cbus_probe; -static device_attach_t le_cbus_attach; -static device_detach_t le_cbus_detach; -static device_resume_t le_cbus_resume; -static device_suspend_t le_cbus_suspend; - -static device_method_t le_cbus_methods[] = { - /* Device interface */ - DEVMETHOD(device_probe, le_cbus_probe), - DEVMETHOD(device_attach, le_cbus_attach), - DEVMETHOD(device_detach, le_cbus_detach), - /* We can just use the suspend method here. */ - DEVMETHOD(device_shutdown, le_cbus_suspend), - DEVMETHOD(device_suspend, le_cbus_suspend), - DEVMETHOD(device_resume, le_cbus_resume), - - { 0, 0 } -}; - -DEFINE_CLASS_0(le, le_cbus_driver, le_cbus_methods, sizeof(struct le_cbus_softc)); -DRIVER_MODULE(le, isa, le_cbus_driver, le_devclass, 0, 0); -MODULE_DEPEND(le, ether, 1, 1, 1); - -static bus_addr_t le_ioaddr_cnet98s[CNET98S_IOSIZE] = { - 0x000, 0x001, 0x002, 0x003, 0x004, 0x005, 0x006, 0x007, - 0x008, 0x009, 0x00a, 0x00b, 0x00c, 0x00d, 0x00e, 0x00f, - 0x400, 0x401, 0x402, 0x403, 0x404, 0x405, 0x406, 0x407, - 0x408, 0x409, 0x40a, 0x40b, 0x40c, 0x40d, 0x40e, 0x40f, -}; - -static void le_cbus_wrbcr(struct lance_softc *, uint16_t, uint16_t); -#ifdef LEDEBUG -static uint16_t le_cbus_rdbcr(struct lance_softc *, uint16_t); -#endif -static void le_cbus_wrcsr(struct lance_softc *, uint16_t, uint16_t); -static uint16_t le_cbus_rdcsr(struct lance_softc *, uint16_t); -static void le_cbus_hwreset(struct lance_softc *); -static bus_dmamap_callback_t le_cbus_dma_callback; - -static void -le_cbus_wrbcr(struct lance_softc *sc, uint16_t port, uint16_t val) -{ - struct le_cbus_softc *lesc = (struct le_cbus_softc *)sc; - - bus_write_2(lesc->sc_rres, CNET98S_RAP, port); - bus_barrier(lesc->sc_rres, CNET98S_RAP, 2, BUS_SPACE_BARRIER_WRITE); - bus_write_2(lesc->sc_rres, CNET98S_BDP, val); -} - -#ifdef LEDEBUG -static uint16_t -le_cbus_rdbcr(struct lance_softc *sc, uint16_t port) -{ - struct le_cbus_softc *lesc = (struct le_cbus_softc *)sc; - - bus_write_2(lesc->sc_rres, CNET98S_RAP, port); - bus_barrier(lesc->sc_rres, CNET98S_RAP, 2, BUS_SPACE_BARRIER_WRITE); - return (bus_read_2(lesc->sc_rres, CNET98S_BDP)); -} -#endif - -static void -le_cbus_wrcsr(struct lance_softc *sc, uint16_t port, uint16_t val) -{ - struct le_cbus_softc *lesc = (struct le_cbus_softc *)sc; - - bus_write_2(lesc->sc_rres, CNET98S_RAP, port); - bus_barrier(lesc->sc_rres, CNET98S_RAP, 2, BUS_SPACE_BARRIER_WRITE); - bus_write_2(lesc->sc_rres, CNET98S_RDP, val); -} - -static uint16_t -le_cbus_rdcsr(struct lance_softc *sc, uint16_t port) -{ - struct le_cbus_softc *lesc = (struct le_cbus_softc *)sc; - - bus_write_2(lesc->sc_rres, CNET98S_RAP, port); - bus_barrier(lesc->sc_rres, CNET98S_RAP, 2, BUS_SPACE_BARRIER_WRITE); - return (bus_read_2(lesc->sc_rres, CNET98S_RDP)); -} - -static void -le_cbus_hwreset(struct lance_softc *sc) -{ - struct le_cbus_softc *lesc = (struct le_cbus_softc *)sc; - - /* - * NB: These are Contec C-NET(98)S only. - */ - - /* Reset the chip. */ - bus_write_2(lesc->sc_rres, CNET98S_RESET, - bus_read_2(lesc->sc_rres, CNET98S_RESET)); - DELAY(500); - - /* ISA bus configuration */ - /* ISACSR0 - set Master Mode Read Active time to 300ns. */ - le_cbus_wrbcr(sc, LE_BCR0, 0x0006); - /* ISACSR1 - set Master Mode Write Active time to 300ns. */ - le_cbus_wrbcr(sc, LE_BCR1, 0x0006); -#ifdef LEDEBUG - device_printf(dev, "ISACSR2=0x%x\n", le_cbus_rdbcr(sc, LE_BCR2)); -#endif - /* ISACSR5 - LED1 */ - le_cbus_wrbcr(sc, LE_BCR5, LE_B4_PSE | LE_B4_XMTE); - /* ISACSR6 - LED2 */ - le_cbus_wrbcr(sc, LE_BCR6, LE_B4_PSE | LE_B4_RCVE); - /* ISACSR7 - LED3 */ - le_cbus_wrbcr(sc, LE_BCR7, LE_B4_PSE | LE_B4_COLE); -} - -static void -le_cbus_dma_callback(void *xsc, bus_dma_segment_t *segs, int nsegs, int error) -{ - struct lance_softc *sc = (struct lance_softc *)xsc; - - if (error != 0) - return; - KASSERT(nsegs == 1, ("%s: bad DMA segment count", __func__)); - sc->sc_addr = segs[0].ds_addr; -} - -static int -le_cbus_probe(device_t dev) -{ - struct le_cbus_softc *lesc; - struct lance_softc *sc; - int error, i; - - /* - * Skip PnP devices as some wedge when trying to probe them as - * C-NET(98)S. - */ - if (isa_get_vendorid(dev)) - return (ENXIO); - - lesc = device_get_softc(dev); - sc = &lesc->sc_am7990.lsc; - - i = 0; - lesc->sc_rres = isa_alloc_resourcev(dev, SYS_RES_IOPORT, &i, - le_ioaddr_cnet98s, CNET98S_IOSIZE, RF_ACTIVE); - if (lesc->sc_rres == NULL) - return (ENXIO); - isa_load_resourcev(lesc->sc_rres, le_ioaddr_cnet98s, CNET98S_IOSIZE); - - /* Reset the chip. */ - bus_write_2(lesc->sc_rres, CNET98S_RESET, - bus_read_2(lesc->sc_rres, CNET98S_RESET)); - DELAY(500); - - /* Stop the chip and put it in a known state. */ - le_cbus_wrcsr(sc, LE_CSR0, LE_C0_STOP); - DELAY(100); - if (le_cbus_rdcsr(sc, LE_CSR0) != LE_C0_STOP) { - error = ENXIO; - goto fail; - } - le_cbus_wrcsr(sc, LE_CSR3, 0); - device_set_desc(dev, "C-NET(98)S"); - error = BUS_PROBE_DEFAULT; - - fail: - bus_release_resource(dev, SYS_RES_IOPORT, - rman_get_rid(lesc->sc_rres), lesc->sc_rres); - return (error); -} - -static int -le_cbus_attach(device_t dev) -{ - struct le_cbus_softc *lesc; - struct lance_softc *sc; - int error, i; - - lesc = device_get_softc(dev); - sc = &lesc->sc_am7990.lsc; - - LE_LOCK_INIT(sc, device_get_nameunit(dev)); - - i = 0; - lesc->sc_rres = isa_alloc_resourcev(dev, SYS_RES_IOPORT, &i, - le_ioaddr_cnet98s, CNET98S_IOSIZE, RF_ACTIVE); - if (lesc->sc_rres == NULL) { - device_printf(dev, "cannot allocate registers\n"); - error = ENXIO; - goto fail_mtx; - } - isa_load_resourcev(lesc->sc_rres, le_ioaddr_cnet98s, CNET98S_IOSIZE); - - i = 0; - if ((lesc->sc_ires = bus_alloc_resource_any(dev, SYS_RES_IRQ, - &i, RF_SHAREABLE | RF_ACTIVE)) == NULL) { - device_printf(dev, "cannot allocate interrupt\n"); - error = ENXIO; - goto fail_rres; - } - - error = bus_dma_tag_create( - bus_get_dma_tag(dev), /* parent */ - 1, 0, /* alignment, boundary */ - BUS_SPACE_MAXADDR_24BIT, /* lowaddr */ - BUS_SPACE_MAXADDR, /* highaddr */ - NULL, NULL, /* filter, filterarg */ - BUS_SPACE_MAXSIZE_32BIT, /* maxsize */ - 0, /* nsegments */ - BUS_SPACE_MAXSIZE_32BIT, /* maxsegsize */ - 0, /* flags */ - NULL, NULL, /* lockfunc, lockarg */ - &lesc->sc_pdmat); - if (error != 0) { - device_printf(dev, "cannot allocate parent DMA tag\n"); - goto fail_ires; - } - - sc->sc_memsize = LE_CBUS_MEMSIZE; - /* - * For Am79C90, Am79C961 and Am79C961A the init block must be 2-byte - * aligned and the ring descriptors must be 8-byte aligned. - */ - error = bus_dma_tag_create( - lesc->sc_pdmat, /* parent */ - 8, 0, /* alignment, boundary */ - BUS_SPACE_MAXADDR_24BIT, /* lowaddr */ - BUS_SPACE_MAXADDR, /* highaddr */ - NULL, NULL, /* filter, filterarg */ - sc->sc_memsize, /* maxsize */ - 1, /* nsegments */ - sc->sc_memsize, /* maxsegsize */ - 0, /* flags */ - NULL, NULL, /* lockfunc, lockarg */ - &lesc->sc_dmat); - if (error != 0) { - device_printf(dev, "cannot allocate buffer DMA tag\n"); - goto fail_pdtag; - } - - error = bus_dmamem_alloc(lesc->sc_dmat, (void **)&sc->sc_mem, - BUS_DMA_WAITOK | BUS_DMA_COHERENT, &lesc->sc_dmam); - if (error != 0) { - device_printf(dev, "cannot allocate DMA buffer memory\n"); - goto fail_dtag; - } - - sc->sc_addr = 0; - error = bus_dmamap_load(lesc->sc_dmat, lesc->sc_dmam, sc->sc_mem, - sc->sc_memsize, le_cbus_dma_callback, sc, 0); - if (error != 0 || sc->sc_addr == 0) { - device_printf(dev, "cannot load DMA buffer map\n"); - goto fail_dmem; - } - - sc->sc_flags = 0; - sc->sc_conf3 = 0; - - /* - * Extract the physical MAC address from the ROM. - */ - for (i = 0; i < sizeof(sc->sc_enaddr); i++) - sc->sc_enaddr[i] = bus_read_1(lesc->sc_rres, i * 2); - - sc->sc_copytodesc = lance_copytobuf_contig; - sc->sc_copyfromdesc = lance_copyfrombuf_contig; - sc->sc_copytobuf = lance_copytobuf_contig; - sc->sc_copyfrombuf = lance_copyfrombuf_contig; - sc->sc_zerobuf = lance_zerobuf_contig; - - sc->sc_rdcsr = le_cbus_rdcsr; - sc->sc_wrcsr = le_cbus_wrcsr; - sc->sc_hwreset = le_cbus_hwreset; - sc->sc_hwinit = NULL; - sc->sc_hwintr = NULL; - sc->sc_nocarrier = NULL; - sc->sc_mediachange = NULL; - sc->sc_mediastatus = NULL; - sc->sc_supmedia = NULL; - - error = am7990_config(&lesc->sc_am7990, device_get_name(dev), - device_get_unit(dev)); - if (error != 0) { - device_printf(dev, "cannot attach Am7990\n"); - goto fail_dmap; - } - - error = bus_setup_intr(dev, lesc->sc_ires, INTR_TYPE_NET | INTR_MPSAFE, - NULL, am7990_intr, sc, &lesc->sc_ih); - if (error != 0) { - device_printf(dev, "cannot set up interrupt\n"); - goto fail_am7990; - } - - return (0); - - fail_am7990: - am7990_detach(&lesc->sc_am7990); - fail_dmap: - bus_dmamap_unload(lesc->sc_dmat, lesc->sc_dmam); - fail_dmem: - bus_dmamem_free(lesc->sc_dmat, sc->sc_mem, lesc->sc_dmam); - fail_dtag: - bus_dma_tag_destroy(lesc->sc_dmat); - fail_pdtag: - bus_dma_tag_destroy(lesc->sc_pdmat); - fail_ires: - bus_release_resource(dev, SYS_RES_IRQ, - rman_get_rid(lesc->sc_ires), lesc->sc_ires); - fail_rres: - bus_release_resource(dev, SYS_RES_IOPORT, - rman_get_rid(lesc->sc_rres), lesc->sc_rres); - fail_mtx: - LE_LOCK_DESTROY(sc); - return (error); -} - -static int -le_cbus_detach(device_t dev) -{ - struct le_cbus_softc *lesc; - struct lance_softc *sc; - - lesc = device_get_softc(dev); - sc = &lesc->sc_am7990.lsc; - - bus_teardown_intr(dev, lesc->sc_ires, lesc->sc_ih); - am7990_detach(&lesc->sc_am7990); - bus_dmamap_unload(lesc->sc_dmat, lesc->sc_dmam); - bus_dmamem_free(lesc->sc_dmat, sc->sc_mem, lesc->sc_dmam); - bus_dma_tag_destroy(lesc->sc_dmat); - bus_dma_tag_destroy(lesc->sc_pdmat); - bus_release_resource(dev, SYS_RES_IRQ, - rman_get_rid(lesc->sc_ires), lesc->sc_ires); - bus_release_resource(dev, SYS_RES_IOPORT, - rman_get_rid(lesc->sc_rres), lesc->sc_rres); - LE_LOCK_DESTROY(sc); - - return (0); -} - -static int -le_cbus_suspend(device_t dev) -{ - struct le_cbus_softc *lesc; - - lesc = device_get_softc(dev); - - lance_suspend(&lesc->sc_am7990.lsc); - - return (0); -} - -static int -le_cbus_resume(device_t dev) -{ - struct le_cbus_softc *lesc; - - lesc = device_get_softc(dev); - - lance_resume(&lesc->sc_am7990.lsc); - - return (0); -} diff --git a/sys/dev/mmc/mmc.c b/sys/dev/mmc/mmc.c index d5e5256ebecd..521a23746266 100644 --- a/sys/dev/mmc/mmc.c +++ b/sys/dev/mmc/mmc.c @@ -259,7 +259,7 @@ mmc_suspend(device_t dev) err = bus_generic_suspend(dev); if (err) - return (err); + return (err); mmc_power_down(sc); return (0); } @@ -980,10 +980,14 @@ mmc_decode_csd_sd(uint32_t *raw_csd, struct mmc_csd *csd) csd->write_blk_misalign = mmc_get_bits(raw_csd, 128, 78, 1); csd->read_blk_misalign = mmc_get_bits(raw_csd, 128, 77, 1); csd->dsr_imp = mmc_get_bits(raw_csd, 128, 76, 1); - csd->vdd_r_curr_min = cur_min[mmc_get_bits(raw_csd, 128, 59, 3)]; - csd->vdd_r_curr_max = cur_max[mmc_get_bits(raw_csd, 128, 56, 3)]; - csd->vdd_w_curr_min = cur_min[mmc_get_bits(raw_csd, 128, 53, 3)]; - csd->vdd_w_curr_max = cur_max[mmc_get_bits(raw_csd, 128, 50, 3)]; + csd->vdd_r_curr_min = + cur_min[mmc_get_bits(raw_csd, 128, 59, 3)]; + csd->vdd_r_curr_max = + cur_max[mmc_get_bits(raw_csd, 128, 56, 3)]; + csd->vdd_w_curr_min = + cur_min[mmc_get_bits(raw_csd, 128, 53, 3)]; + csd->vdd_w_curr_max = + cur_max[mmc_get_bits(raw_csd, 128, 50, 3)]; m = mmc_get_bits(raw_csd, 128, 62, 12); e = mmc_get_bits(raw_csd, 128, 47, 3); csd->capacity = ((1 + m) << (e + 2)) * csd->read_bl_len; @@ -1008,8 +1012,8 @@ mmc_decode_csd_sd(uint32_t *raw_csd, struct mmc_csd *csd) csd->write_blk_misalign = mmc_get_bits(raw_csd, 128, 78, 1); csd->read_blk_misalign = mmc_get_bits(raw_csd, 128, 77, 1); csd->dsr_imp = mmc_get_bits(raw_csd, 128, 76, 1); - csd->capacity = ((uint64_t)mmc_get_bits(raw_csd, 128, 48, 22) + 1) * - 512 * 1024; + csd->capacity = ((uint64_t)mmc_get_bits(raw_csd, 128, 48, 22) + + 1) * 512 * 1024; csd->erase_blk_en = mmc_get_bits(raw_csd, 128, 46, 1); csd->erase_sector = mmc_get_bits(raw_csd, 128, 39, 7) + 1; csd->wp_grp_size = mmc_get_bits(raw_csd, 128, 32, 7); @@ -1307,18 +1311,21 @@ mmc_discover_cards(struct mmc_softc *sc) break; } newcard = 1; - if ((err = device_get_children(sc->dev, &devlist, &devcount)) != 0) + if ((err = device_get_children(sc->dev, &devlist, + &devcount)) != 0) return; for (i = 0; i < devcount; i++) { ivar = device_get_ivars(devlist[i]); - if (memcmp(ivar->raw_cid, raw_cid, sizeof(raw_cid)) == 0) { + if (memcmp(ivar->raw_cid, raw_cid, sizeof(raw_cid)) == + 0) { newcard = 0; break; } } free(devlist, M_TEMP); if (bootverbose || mmc_debug) { - device_printf(sc->dev, "%sard detected (CID %08x%08x%08x%08x)\n", + device_printf(sc->dev, + "%sard detected (CID %08x%08x%08x%08x)\n", newcard ? "New c" : "C", raw_cid[0], raw_cid[1], raw_cid[2], raw_cid[3]); } @@ -1370,7 +1377,7 @@ mmc_discover_cards(struct mmc_softc *sc) mmc_app_decode_scr(ivar->raw_scr, &ivar->scr); /* Get card switch capabilities (command class 10). */ if ((ivar->scr.sda_vsn >= 1) && - (ivar->csd.ccc & (1<<10))) { + (ivar->csd.ccc & (1 << 10))) { mmc_sd_switch(sc, SD_SWITCH_MODE_CHECK, SD_SWITCH_GROUP1, SD_SWITCH_NOCHANGE, switch_res); @@ -1537,7 +1544,8 @@ mmc_rescan_cards(struct mmc_softc *sc) ivar = device_get_ivars(devlist[i]); if (mmc_select_card(sc, ivar->rca)) { if (bootverbose || mmc_debug) - device_printf(sc->dev, "Card at relative address %d lost.\n", + device_printf(sc->dev, + "Card at relative address %d lost.\n", ivar->rca); device_delete_child(sc->dev, devlist[i]); free(ivar, M_DEVBUF); @@ -1559,7 +1567,8 @@ mmc_delete_cards(struct mmc_softc *sc) for (i = 0; i < devcount; i++) { ivar = device_get_ivars(devlist[i]); if (bootverbose || mmc_debug) - device_printf(sc->dev, "Card at relative address %d deleted.\n", + device_printf(sc->dev, + "Card at relative address %d deleted.\n", ivar->rca); device_delete_child(sc->dev, devlist[i]); free(ivar, M_DEVBUF); @@ -1589,7 +1598,8 @@ mmc_go_discovery(struct mmc_softc *sc) mmc_idle_cards(sc); err = mmc_send_if_cond(sc, 1); if ((bootverbose || mmc_debug) && err == 0) - device_printf(sc->dev, "SD 2.0 interface conditions: OK\n"); + device_printf(sc->dev, + "SD 2.0 interface conditions: OK\n"); if (mmc_send_app_op_cond(sc, 0, &ocr) != MMC_ERR_NONE) { if (bootverbose || mmc_debug) device_printf(sc->dev, "SD probe: failed\n"); @@ -1599,13 +1609,15 @@ mmc_go_discovery(struct mmc_softc *sc) mmcbr_set_mode(dev, mode_mmc); if (mmc_send_op_cond(sc, 0, &ocr) != MMC_ERR_NONE) { if (bootverbose || mmc_debug) - device_printf(sc->dev, "MMC probe: failed\n"); + device_printf(sc->dev, + "MMC probe: failed\n"); ocr = 0; /* Failed both, powerdown. */ } else if (bootverbose || mmc_debug) device_printf(sc->dev, "MMC probe: OK (OCR: 0x%08x)\n", ocr); } else if (bootverbose || mmc_debug) - device_printf(sc->dev, "SD probe: OK (OCR: 0x%08x)\n", ocr); + device_printf(sc->dev, "SD probe: OK (OCR: 0x%08x)\n", + ocr); sc->squelched--; mmcbr_set_ocr(dev, mmc_select_vdd(sc, ocr)); @@ -1622,7 +1634,8 @@ mmc_go_discovery(struct mmc_softc *sc) * one card on the bus. */ if (bootverbose || mmc_debug) - device_printf(sc->dev, "Current OCR: 0x%08x\n", mmcbr_get_ocr(dev)); + device_printf(sc->dev, "Current OCR: 0x%08x\n", + mmcbr_get_ocr(dev)); if (mmcbr_get_ocr(dev) == 0) { device_printf(sc->dev, "No compatible cards found on bus\n"); mmc_delete_cards(sc); @@ -1760,6 +1773,7 @@ mmc_read_ivar(device_t bus, device_t child, int which, uintptr_t *result) static int mmc_write_ivar(device_t bus, device_t child, int which, uintptr_t value) { + /* * None are writable ATM */ diff --git a/sys/dev/mmc/mmcsd.c b/sys/dev/mmc/mmcsd.c index ac697a3cf814..65005c98bc41 100644 --- a/sys/dev/mmc/mmcsd.c +++ b/sys/dev/mmc/mmcsd.c @@ -113,7 +113,7 @@ static int mmcsd_probe(device_t dev); /* disk routines */ static int mmcsd_close(struct disk *dp); static int mmcsd_dump(void *arg, void *virtual, vm_offset_t physical, - off_t offset, size_t length); + off_t offset, size_t length); static int mmcsd_open(struct disk *dp); static void mmcsd_strategy(struct bio *bp); static void mmcsd_task(void *arg); @@ -122,14 +122,14 @@ static int mmcsd_bus_bit_width(device_t dev); static daddr_t mmcsd_delete(struct mmcsd_softc *sc, struct bio *bp); static daddr_t mmcsd_rw(struct mmcsd_softc *sc, struct bio *bp); -#define MMCSD_LOCK(_sc) mtx_lock(&(_sc)->sc_mtx) +#define MMCSD_LOCK(_sc) mtx_lock(&(_sc)->sc_mtx) #define MMCSD_UNLOCK(_sc) mtx_unlock(&(_sc)->sc_mtx) -#define MMCSD_LOCK_INIT(_sc) \ +#define MMCSD_LOCK_INIT(_sc) \ mtx_init(&_sc->sc_mtx, device_get_nameunit(_sc->dev), \ "mmcsd", MTX_DEF) -#define MMCSD_LOCK_DESTROY(_sc) mtx_destroy(&_sc->sc_mtx); -#define MMCSD_ASSERT_LOCKED(_sc) mtx_assert(&_sc->sc_mtx, MA_OWNED); -#define MMCSD_ASSERT_UNLOCKED(_sc) mtx_assert(&_sc->sc_mtx, MA_NOTOWNED); +#define MMCSD_LOCK_DESTROY(_sc) mtx_destroy(&_sc->sc_mtx); +#define MMCSD_ASSERT_LOCKED(_sc) mtx_assert(&_sc->sc_mtx, MA_OWNED); +#define MMCSD_ASSERT_UNLOCKED(_sc) mtx_assert(&_sc->sc_mtx, MA_NOTOWNED); static int mmcsd_probe(device_t dev) @@ -208,7 +208,7 @@ mmcsd_attach(device_t dev) sc->running = 1; sc->suspend = 0; sc->eblock = sc->eend = 0; - kproc_create(&mmcsd_task, sc, &sc->p, 0, 0, "%s: mmc/sd card", + kproc_create(&mmcsd_task, sc, &sc->p, 0, 0, "%s: mmc/sd card", device_get_nameunit(dev)); return (0); @@ -311,6 +311,7 @@ mmcsd_strategy(struct bio *bp) static const char * mmcsd_errmsg(int e) { + if (e < 0 || e > MMC_ERR_MAX) return "Bad error code"; return errmsg[e]; @@ -325,17 +326,18 @@ mmcsd_rw(struct mmcsd_softc *sc, struct bio *bp) struct mmc_request req; struct mmc_data data; device_t dev = sc->dev; - int sz = sc->disk->d_sectorsize; + int numblocks, sz; device_t mmcbr = device_get_parent(dev); + char *vaddr; block = bp->bio_pblkno; + sz = sc->disk->d_sectorsize; end = bp->bio_pblkno + (bp->bio_bcount / sz); while (block < end) { - char *vaddr = bp->bio_data + - (block - bp->bio_pblkno) * sz; - int numblocks = min(end - block, mmc_get_max_data(dev)); + vaddr = bp->bio_data + (block - bp->bio_pblkno) * sz; + numblocks = min(end - block, mmc_get_max_data(dev)); memset(&req, 0, sizeof(req)); - memset(&cmd, 0, sizeof(cmd)); + memset(&cmd, 0, sizeof(cmd)); memset(&stop, 0, sizeof(stop)); memset(&data, 0, sizeof(data)); cmd.mrq = &req; @@ -373,10 +375,11 @@ mmcsd_rw(struct mmcsd_softc *sc, struct bio *bp) } MMCBUS_WAIT_FOR_REQUEST(mmcbr, dev, &req); if (req.cmd->error != MMC_ERR_NONE) { - if (ppsratecheck(&sc->log_time, &sc->log_count, LOG_PPS)) { + if (ppsratecheck(&sc->log_time, &sc->log_count, + LOG_PPS)) device_printf(dev, "Error indicated: %d %s\n", - req.cmd->error, mmcsd_errmsg(req.cmd->error)); - } + req.cmd->error, + mmcsd_errmsg(req.cmd->error)); break; } block += numblocks; @@ -407,7 +410,7 @@ mmcsd_delete(struct mmcsd_softc *sc, struct bio *bp) start = block + erase_sector - 1; /* Round up. */ start -= start % erase_sector; stop = end; /* Round down. */ - stop -= end % erase_sector; + stop -= end % erase_sector; /* We can't erase area smaller then sector, store it for later. */ if (start >= stop) { sc->eblock = block; @@ -475,8 +478,8 @@ mmcsd_delete(struct mmcsd_softc *sc, struct bio *bp) } static int -mmcsd_dump(void *arg, void *virtual, vm_offset_t physical, - off_t offset, size_t length) +mmcsd_dump(void *arg, void *virtual, vm_offset_t physical, off_t offset, + size_t length) { struct disk *disk = arg; struct mmcsd_softc *sc = (struct mmcsd_softc *)disk->d_drv1; diff --git a/sys/dev/mse/mse_cbus.c b/sys/dev/mse/mse_cbus.c deleted file mode 100644 index 21924b60b9ee..000000000000 --- a/sys/dev/mse/mse_cbus.c +++ /dev/null @@ -1,301 +0,0 @@ -/*- - * Copyright (c) 2004 M. Warner Losh - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * $FreeBSD$ - */ - -/*- - * Copyright 1992 by the University of Guelph - * - * Permission to use, copy and modify this - * software and its documentation for any purpose and without - * fee is hereby granted, provided that the above copyright - * notice appear in all copies and that both that copyright - * notice and this permission notice appear in supporting - * documentation. - * University of Guelph makes no representations about the suitability of - * this software for any purpose. It is provided "as is" - * without express or implied warranty. - */ -/* - * Driver for the Logitech and ATI Inport Bus mice for use with 386bsd and - * the X386 port, courtesy of - * Rick Macklem, rick@snowhite.cis.uoguelph.ca - * Caveats: The driver currently uses spltty(), but doesn't use any - * generic tty code. It could use splmse() (that only masks off the - * bus mouse interrupt, but that would require hacking in i386/isa/icu.s. - * (This may be worth the effort, since the Logitech generates 30/60 - * interrupts/sec continuously while it is open.) - * NB: The ATI has NOT been tested yet! - */ - -/* - * Modification history: - * Sep 6, 1994 -- Lars Fredriksen(fredriks@mcs.com) - * improved probe based on input from Logitech. - * - * Oct 19, 1992 -- E. Stark (stark@cs.sunysb.edu) - * fixes to make it work with Microsoft InPort busmouse - * - * Jan, 1993 -- E. Stark (stark@cs.sunysb.edu) - * added patches for new "select" interface - * - * May 4, 1993 -- E. Stark (stark@cs.sunysb.edu) - * changed position of some spl()'s in mseread - * - * October 8, 1993 -- E. Stark (stark@cs.sunysb.edu) - * limit maximum negative x/y value to -127 to work around XFree problem - * that causes spurious button pushes. - */ - -#include <sys/param.h> -#include <sys/systm.h> -#include <sys/conf.h> -#include <sys/kernel.h> -#include <sys/module.h> -#include <sys/bus.h> -#include <sys/poll.h> -#include <sys/selinfo.h> -#include <sys/uio.h> -#include <sys/mouse.h> - -#include <machine/bus.h> -#include <machine/resource.h> -#include <sys/rman.h> - -#include <isa/isavar.h> - -#include <dev/mse/msevar.h> - -static int mse_cbus_probe(device_t dev); -static int mse_cbus_attach(device_t dev); - -static device_method_t mse_methods[] = { - DEVMETHOD(device_probe, mse_cbus_probe), - DEVMETHOD(device_attach, mse_cbus_attach), - DEVMETHOD(device_detach, mse_detach), - { 0, 0 } -}; - -static driver_t mse_driver = { - "mse", - mse_methods, - sizeof(mse_softc_t), -}; - -DRIVER_MODULE(mse, isa, mse_driver, mse_devclass, 0, 0); - -static struct isa_pnp_id mse_ids[] = { -#if 0 - { 0x001fa3b8, "PC-98 bus mouse" }, /* NEC1F00 */ -#endif - { 0 } -}; - -/* - * PC-9801 Bus mouse definitions - */ - -#define MODE MSE_PORTD -#define HC MSE_PORTD -#define INT MSE_PORTD - -#define XL 0x00 -#define XH 0x20 -#define YL 0x40 -#define YH 0x60 - -#define INT_ENABLE 0x8 -#define INT_DISABLE 0x9 -#define HC_NO_CLEAR 0xe -#define HC_CLEAR 0xf - -static bus_addr_t mse_port[] = {0, 2, 4, 6}; - -static int mse_probe98m(device_t dev, mse_softc_t *sc); -static void mse_disable98m(struct resource *port); -static void mse_get98m(struct resource *port, - int *dx, int *dy, int *but); -static void mse_enable98m(struct resource *port); - -static struct mse_types mse_types[] = { - { MSE_98BUSMOUSE, - mse_probe98m, mse_enable98m, mse_disable98m, mse_get98m, - { 2, MOUSE_IF_BUS, MOUSE_MOUSE, MOUSE_MODEL_GENERIC, 0, }, - { MOUSE_PROTO_BUS, -1, -1, 0, 0, MOUSE_MSC_PACKETSIZE, - { MOUSE_MSC_SYNCMASK, MOUSE_MSC_SYNC, }, }, }, - { 0, }, -}; - -static int -mse_cbus_probe(device_t dev) -{ - mse_softc_t *sc; - int error; - int rid; - int i; - - /* check PnP IDs */ - error = ISA_PNP_PROBE(device_get_parent(dev), dev, mse_ids); - if (error == ENXIO) - return error; - - sc = device_get_softc(dev); - rid = 0; - sc->sc_port = isa_alloc_resourcev(dev, SYS_RES_IOPORT, &rid, mse_port, - MSE_IOSIZE, RF_ACTIVE); - if (sc->sc_port == NULL) - return ENXIO; - if (isa_load_resourcev(sc->sc_port, mse_port, MSE_IOSIZE)) { - bus_release_resource(dev, SYS_RES_IOPORT, rid, sc->sc_port); - return ENXIO; - } - - /* - * Check for each mouse type in the table. - */ - i = 0; - while (mse_types[i].m_type) { - if ((*mse_types[i].m_probe)(dev, sc)) { - sc->sc_mousetype = mse_types[i].m_type; - sc->sc_enablemouse = mse_types[i].m_enable; - sc->sc_disablemouse = mse_types[i].m_disable; - sc->sc_getmouse = mse_types[i].m_get; - sc->hw = mse_types[i].m_hw; - sc->mode = mse_types[i].m_mode; - bus_release_resource(dev, SYS_RES_IOPORT, rid, - sc->sc_port); - device_set_desc(dev, "Bus/InPort Mouse"); - return 0; - } - i++; - } - bus_release_resource(dev, SYS_RES_IOPORT, rid, sc->sc_port); - return ENXIO; -} - -static int -mse_cbus_attach(device_t dev) -{ - mse_softc_t *sc; - int rid; - - sc = device_get_softc(dev); - - rid = 0; - sc->sc_port = isa_alloc_resourcev(dev, SYS_RES_IOPORT, &rid, mse_port, - MSE_IOSIZE, RF_ACTIVE); - if (sc->sc_port == NULL) - return ENXIO; - if (isa_load_resourcev(sc->sc_port, mse_port, MSE_IOSIZE)) { - bus_release_resource(dev, SYS_RES_IOPORT, rid, sc->sc_port); - return ENXIO; - } - - return (mse_common_attach(dev)); -} - -/* - * Routines for the PC98 bus mouse. - */ - -/* - * Test for a PC98 bus mouse and return 1 if it is. - * (do not enable interrupts) - */ -static int -mse_probe98m(device_t dev, mse_softc_t *sc) -{ - /* mode set */ - bus_write_1(sc->sc_port, MODE, 0x93); - - /* initialize */ - /* INT disable */ - bus_write_1(sc->sc_port, INT, INT_DISABLE); - /* HC = 0 */ - bus_write_1(sc->sc_port, HC, HC_NO_CLEAR); - /* HC = 1 */ - bus_write_1(sc->sc_port, HC, HC_CLEAR); - - return (1); -} - -/* - * Initialize PC98 bus mouse and enable interrupts. - */ -static void -mse_enable98m(struct resource *port) -{ - bus_write_1(port, INT, INT_ENABLE); /* INT enable */ - bus_write_1(port, HC, HC_NO_CLEAR); /* HC = 0 */ - bus_write_1(port, HC, HC_CLEAR); /* HC = 1 */ -} - -/* - * Disable interrupts for PC98 Bus mouse. - */ -static void -mse_disable98m(struct resource *port) -{ - bus_write_1(port, INT, INT_DISABLE); /* INT disable */ - bus_write_1(port, HC, HC_NO_CLEAR); /* HC = 0 */ - bus_write_1(port, HC, HC_CLEAR); /* HC = 1 */ -} - -/* - * Get current dx, dy and up/down button state. - */ -static void -mse_get98m(struct resource *port, int *dx, int *dy, int *but) -{ - register char x, y; - - bus_write_1(port, INT, INT_DISABLE); /* INT disable */ - - bus_write_1(port, HC, HC_CLEAR); /* HC = 1 */ - - /* X low */ - bus_write_1(port, MSE_PORTC, 0x90 | XL); - x = bus_read_1(port, MSE_PORTA) & 0x0f; - /* X high */ - bus_write_1(port, MSE_PORTC, 0x90 | XH); - x |= ((bus_read_1(port, MSE_PORTA) & 0x0f) << 4); - - /* Y low */ - bus_write_1(port, MSE_PORTC, 0x90 | YL); - y = (bus_read_1(port, MSE_PORTA) & 0x0f); - /* Y high */ - bus_write_1(port, MSE_PORTC, 0x90 | YH); - y |= ((bus_read_1(port, MSE_PORTA) & 0x0f) << 4); - - *but = (bus_read_1(port, MSE_PORTA) >> 5) & 7; - - *dx = x; - *dy = y; - - bus_write_1(port, HC, HC_NO_CLEAR); /* HC = 0 */ - - bus_write_1(port, INT, INT_ENABLE); /* INT enable */ -} diff --git a/sys/dev/mse/msevar.h b/sys/dev/mse/msevar.h index 74a393f0ef0a..19b069ea27d5 100644 --- a/sys/dev/mse/msevar.h +++ b/sys/dev/mse/msevar.h @@ -87,9 +87,6 @@ typedef struct mse_softc { /* and Mouse Types */ #define MSE_NONE 0 /* don't move this! */ -/* pc98 bus mouse types */ -#define MSE_98BUSMOUSE 0x1 - /* isa bus mouse types */ #define MSE_LOGITECH 0x1 #define MSE_ATIINPORT 0x2 diff --git a/sys/dev/pccbb/pccbb_isa.c b/sys/dev/pccbb/pccbb_isa.c index 6ef441f35e94..d2a0d03fc933 100644 --- a/sys/dev/pccbb/pccbb_isa.c +++ b/sys/dev/pccbb/pccbb_isa.c @@ -113,8 +113,6 @@ static struct isa_pnp_id pcic_ids[] = { {EXCA_PNP_VLSI_82C146, NULL}, /* PNP0E02 */ {EXCA_PNP_82365_CARDBUS, NULL}, /* PNP0E03 */ {EXCA_PNP_SCM_SWAPBOX, NULL}, /* SCM0469 */ - {EXCA_NEC_PC9801_102, NULL}, /* NEC8091 */ - {EXCA_NEC_PC9821RA_E01, NULL}, /* NEC8121 */ {0} }; diff --git a/sys/dev/pci/isa_pci.c b/sys/dev/pci/isa_pci.c index 950920da0c82..94a4732b5079 100644 --- a/sys/dev/pci/isa_pci.c +++ b/sys/dev/pci/isa_pci.c @@ -136,9 +136,6 @@ isab_pci_probe(device_t dev) case 0x00001078: /* Cyrix Cx5510 */ case 0x01001078: /* Cyrix Cx5530 */ case 0xc7001045: /* OPTi 82C700 (FireStar) */ - case 0x00011033: /* NEC 0001 (C-bus) */ - case 0x002c1033: /* NEC 002C (C-bus) */ - case 0x003b1033: /* NEC 003B (C-bus) */ case 0x886a1060: /* UMC UM8886 ISA */ case 0x02001166: /* ServerWorks IB6566 PCI */ if (bootverbose) diff --git a/sys/dev/pci/vga_pci.c b/sys/dev/pci/vga_pci.c index 3cc6ac343e9c..3e7c7447a8f0 100644 --- a/sys/dev/pci/vga_pci.c +++ b/sys/dev/pci/vga_pci.c @@ -207,7 +207,7 @@ vga_pci_unmap_bios(device_t dev, void *bios) int vga_pci_repost(device_t dev) { -#if defined(__amd64__) || (defined(__i386__) && !defined(PC98)) +#if defined(__amd64__) || defined(__i386__) x86regs_t regs; if (!vga_pci_is_boot_display(dev)) diff --git a/sys/dev/ppc/ppc.c b/sys/dev/ppc/ppc.c index 4c6761fb279c..9515039036d9 100644 --- a/sys/dev/ppc/ppc.c +++ b/sys/dev/ppc/ppc.c @@ -67,11 +67,6 @@ static void ppcintr(void *arg); #define LOG_PPC(function, ppc, string) \ if (bootverbose) printf("%s: %s\n", function, string) -#if defined(__i386__) && defined(PC98) -#define PC98_IEEE_1284_DISABLE 0x100 -#define PC98_IEEE_1284_PORT 0x140 -#endif - #define DEVTOSOFTC(dev) ((struct ppc_data *)device_get_softc(dev)) /* @@ -1667,10 +1662,6 @@ ppc_probe(device_t dev, int rid) { #ifdef __i386__ static short next_bios_ppc = 0; -#ifdef PC98 - unsigned int pc98_ieee_mode = 0x00; - unsigned int tmp; -#endif #endif struct ppc_data *ppc; int error; @@ -1692,16 +1683,6 @@ ppc_probe(device_t dev, int rid) * If port not specified, use bios list. */ if (error) { -#ifdef PC98 - if (next_bios_ppc == 0) { - /* Use default IEEE-1284 port of NEC PC-98x1 */ - port = PC98_IEEE_1284_PORT; - next_bios_ppc += 1; - if (bootverbose) - device_printf(dev, - "parallel port found at 0x%jx\n", port); - } -#else if ((next_bios_ppc < BIOS_MAX_PPC) && (*(BIOS_PORTS + next_bios_ppc) != 0)) { port = *(BIOS_PORTS + next_bios_ppc++); @@ -1712,7 +1693,6 @@ ppc_probe(device_t dev, int rid) device_printf(dev, "parallel port not found.\n"); return (ENXIO); } -#endif /* PC98 */ bus_set_resource(dev, SYS_RES_IOPORT, rid, port, IO_LPTSIZE_EXTENDED); } @@ -1771,30 +1751,6 @@ ppc_probe(device_t dev, int rid) ppc->ppc_type = PPC_TYPE_GENERIC; -#if defined(__i386__) && defined(PC98) - /* - * IEEE STD 1284 Function Check and Enable - * for default IEEE-1284 port of NEC PC-98x1 - */ - if (ppc->ppc_base == PC98_IEEE_1284_PORT && - !(ppc->ppc_flags & PC98_IEEE_1284_DISABLE)) { - tmp = inb(ppc->ppc_base + PPC_1284_ENABLE); - pc98_ieee_mode = tmp; - if ((tmp & 0x10) == 0x10) { - outb(ppc->ppc_base + PPC_1284_ENABLE, tmp & ~0x10); - tmp = inb(ppc->ppc_base + PPC_1284_ENABLE); - if ((tmp & 0x10) == 0x10) - goto error; - } else { - outb(ppc->ppc_base + PPC_1284_ENABLE, tmp | 0x10); - tmp = inb(ppc->ppc_base + PPC_1284_ENABLE); - if ((tmp & 0x10) != 0x10) - goto error; - } - outb(ppc->ppc_base + PPC_1284_ENABLE, pc98_ieee_mode | 0x10); - } -#endif - /* * Try to detect the chipset and its mode. */ @@ -1804,12 +1760,6 @@ ppc_probe(device_t dev, int rid) return (0); error: -#if defined(__i386__) && defined(PC98) - if (ppc->ppc_base == PC98_IEEE_1284_PORT && - !(ppc->ppc_flags & PC98_IEEE_1284_DISABLE)) { - outb(ppc->ppc_base + PPC_1284_ENABLE, pc98_ieee_mode); - } -#endif if (ppc->res_irq != 0) { bus_release_resource(dev, SYS_RES_IRQ, ppc->rid_irq, ppc->res_irq); diff --git a/sys/dev/ppc/ppcreg.h b/sys/dev/ppc/ppcreg.h index a7295033d731..fa1f165d6daa 100644 --- a/sys/dev/ppc/ppcreg.h +++ b/sys/dev/ppc/ppcreg.h @@ -130,18 +130,10 @@ struct ppc_data { #define PPC_SPP_CTR 2 /* SPP control register */ #define PPC_EPP_ADDR 3 /* EPP address register (8 bit) */ #define PPC_EPP_DATA 4 /* EPP data register (8, 16 or 32 bit) */ -#if defined(__i386__) && defined(PC98) -#define PPC_1284_ENABLE 0x09 /* IEEE STD 1284 Enable register */ -#define PPC_ECP_D_FIFO 0x0c /* ECP Data fifo register */ -#define PPC_ECP_CNFGA 0x0c /* Configuration register A */ -#define PPC_ECP_CNFGB 0x0d /* Configuration register B */ -#define PPC_ECP_ECR 0x0e /* ECP extended control register */ -#else #define PPC_ECP_D_FIFO 0x400 /* ECP Data fifo register */ #define PPC_ECP_CNFGA 0x400 /* Configuration register A */ #define PPC_ECP_CNFGB 0x401 /* Configuration register B */ #define PPC_ECP_ECR 0x402 /* ECP extended control register */ -#endif #define PPC_FIFO_EMPTY 0x1 /* ecr register - bit 0 */ #define PPC_FIFO_FULL 0x2 /* ecr register - bit 1 */ diff --git a/sys/dev/sdhci/sdhci.c b/sys/dev/sdhci/sdhci.c index 94db7ebc8b1d..681b7d947326 100644 --- a/sys/dev/sdhci/sdhci.c +++ b/sys/dev/sdhci/sdhci.c @@ -96,8 +96,10 @@ static void sdhci_card_task(void *, int); /* * Broadcom BCM577xx Controller Constants */ -#define BCM577XX_DEFAULT_MAX_DIVIDER 256 /* Maximum divider supported by the default clock source. */ -#define BCM577XX_ALT_CLOCK_BASE 63000000 /* Alternative clock's base frequency. */ +/* Maximum divider supported by the default clock source. */ +#define BCM577XX_DEFAULT_MAX_DIVIDER 256 +/* Alternative clock's base frequency. */ +#define BCM577XX_ALT_CLOCK_BASE 63000000 #define BCM577XX_HOST_CONTROL 0x198 #define BCM577XX_CTRL_CLKSEL_MASK 0xFFFFCFFF @@ -122,7 +124,7 @@ slot_printf(struct sdhci_slot *slot, const char * fmt, ...) va_list ap; int retval; - retval = printf("%s-slot%d: ", + retval = printf("%s-slot%d: ", device_get_nameunit(slot->bus), slot->num); va_start(ap, fmt); @@ -266,20 +268,25 @@ sdhci_set_clock(struct sdhci_slot *slot, uint32_t clock) /* If no clock requested - left it so. */ if (clock == 0) return; - + /* Determine the clock base frequency */ clk_base = slot->max_clk; if (slot->quirks & SDHCI_QUIRK_BCM577XX_400KHZ_CLKSRC) { - clk_sel = RD2(slot, BCM577XX_HOST_CONTROL) & BCM577XX_CTRL_CLKSEL_MASK; + clk_sel = RD2(slot, BCM577XX_HOST_CONTROL) & + BCM577XX_CTRL_CLKSEL_MASK; - /* Select clock source appropriate for the requested frequency. */ + /* + * Select clock source appropriate for the requested frequency. + */ if ((clk_base / BCM577XX_DEFAULT_MAX_DIVIDER) > clock) { clk_base = BCM577XX_ALT_CLOCK_BASE; - clk_sel |= (BCM577XX_CTRL_CLKSEL_64MHZ << BCM577XX_CTRL_CLKSEL_SHIFT); + clk_sel |= (BCM577XX_CTRL_CLKSEL_64MHZ << + BCM577XX_CTRL_CLKSEL_SHIFT); } else { - clk_sel |= (BCM577XX_CTRL_CLKSEL_DEFAULT << BCM577XX_CTRL_CLKSEL_SHIFT); + clk_sel |= (BCM577XX_CTRL_CLKSEL_DEFAULT << + BCM577XX_CTRL_CLKSEL_SHIFT); } - + WR2(slot, BCM577XX_HOST_CONTROL, clk_sel); } @@ -303,8 +310,8 @@ sdhci_set_clock(struct sdhci_slot *slot, uint32_t clock) if (clock >= clk_base) div = 0; else { - for (div = 2; div < SDHCI_300_MAX_DIVIDER; div += 2) { - if ((clk_base / div) <= clock) + for (div = 2; div < SDHCI_300_MAX_DIVIDER; div += 2) { + if ((clk_base / div) <= clock) break; } } @@ -312,7 +319,7 @@ sdhci_set_clock(struct sdhci_slot *slot, uint32_t clock) } if (bootverbose || sdhci_debug) - slot_printf(slot, "Divider %d for freq %d (base %d)\n", + slot_printf(slot, "Divider %d for freq %d (base %d)\n", div, clock, clk_base); /* Now we have got divider, set it. */ @@ -329,7 +336,7 @@ sdhci_set_clock(struct sdhci_slot *slot, uint32_t clock) while (!((clk = RD2(slot, SDHCI_CLOCK_CONTROL)) & SDHCI_CLOCK_INT_STABLE)) { if (timeout == 0) { - slot_printf(slot, + slot_printf(slot, "Internal clock never stabilised.\n"); sdhci_dumpregs(slot); return; @@ -555,7 +562,7 @@ sdhci_handle_card_present(struct sdhci_slot *slot, bool is_present) SDHCI_UNLOCK(slot); } -static void +static void sdhci_card_poll(void *arg) { struct sdhci_slot *slot = arg; @@ -565,7 +572,7 @@ sdhci_card_poll(void *arg) callout_reset(&slot->card_poll_callout, SDHCI_CARD_PRESENT_TICKS, sdhci_card_poll, slot); } - + int sdhci_init_slot(device_t dev, struct sdhci_slot *slot, int num) { @@ -611,7 +618,7 @@ sdhci_init_slot(device_t dev, struct sdhci_slot *slot, int num) /* Initialize slot. */ sdhci_init(slot); - slot->version = (RD2(slot, SDHCI_HOST_VERSION) + slot->version = (RD2(slot, SDHCI_HOST_VERSION) >> SDHCI_SPEC_VER_SHIFT) & SDHCI_SPEC_VER_MASK; if (slot->quirks & SDHCI_QUIRK_MISSING_CAPS) caps = slot->caps; @@ -621,7 +628,7 @@ sdhci_init_slot(device_t dev, struct sdhci_slot *slot, int num) if (slot->version >= SDHCI_SPEC_300) freq = (caps & SDHCI_CLOCK_V3_BASE_MASK) >> SDHCI_CLOCK_BASE_SHIFT; - else + else freq = (caps & SDHCI_CLOCK_BASE_MASK) >> SDHCI_CLOCK_BASE_SHIFT; if (freq != 0) @@ -634,7 +641,8 @@ sdhci_init_slot(device_t dev, struct sdhci_slot *slot, int num) if (slot->max_clk == 0) { slot->max_clk = SDHCI_DEFAULT_MAX_FREQ * 1000000; device_printf(dev, "Hardware doesn't specify base clock " - "frequency, using %dMHz as default.\n", SDHCI_DEFAULT_MAX_FREQ); + "frequency, using %dMHz as default.\n", + SDHCI_DEFAULT_MAX_FREQ); } /* Calculate/set timeout clock frequency. */ if (slot->quirks & SDHCI_QUIRK_DATA_TIMEOUT_USES_SDCLK) { @@ -642,8 +650,8 @@ sdhci_init_slot(device_t dev, struct sdhci_slot *slot, int num) } else if (slot->quirks & SDHCI_QUIRK_DATA_TIMEOUT_1MHZ) { slot->timeout_clk = 1000; } else { - slot->timeout_clk = - (caps & SDHCI_TIMEOUT_CLK_MASK) >> SDHCI_TIMEOUT_CLK_SHIFT; + slot->timeout_clk = (caps & SDHCI_TIMEOUT_CLK_MASK) >> + SDHCI_TIMEOUT_CLK_SHIFT; if (caps & SDHCI_TIMEOUT_CLK_UNIT) slot->timeout_clk *= 1000; } @@ -687,7 +695,7 @@ sdhci_init_slot(device_t dev, struct sdhci_slot *slot, int num) if (slot->quirks & SDHCI_QUIRK_ALL_SLOTS_NON_REMOVABLE) slot->opt |= SDHCI_NON_REMOVABLE; - /* + /* * Use platform-provided transfer backend * with PIO as a fallback mechanism */ @@ -825,7 +833,7 @@ sdhci_generic_update_ios(device_t brdev, device_t reqdev) } else { panic("Invalid bus width: %d", ios->bus_width); } - if (ios->timing == bus_timing_hs && + if (ios->timing == bus_timing_hs && !(slot->quirks & SDHCI_QUIRK_DONT_SET_HISPD_BIT)) slot->hostctrl |= SDHCI_CTRL_HISPD; else @@ -839,7 +847,7 @@ sdhci_generic_update_ios(device_t brdev, device_t reqdev) return (0); } -static void +static void sdhci_req_done(struct sdhci_slot *slot) { struct mmc_request *req; @@ -852,8 +860,8 @@ sdhci_req_done(struct sdhci_slot *slot) req->done(req); } } - -static void + +static void sdhci_timeout(void *arg) { struct sdhci_slot *slot = arg; @@ -868,7 +876,7 @@ sdhci_timeout(void *arg) slot_printf(slot, " Spurious timeout - no active command\n"); } } - + static void sdhci_set_transfer_mode(struct sdhci_slot *slot, struct mmc_data *data) @@ -970,7 +978,7 @@ sdhci_start_command(struct sdhci_slot *slot, struct mmc_command *cmd) flags |= SDHCI_CMD_TYPE_ABORT; /* Prepare data. */ sdhci_start_data(slot, cmd->data); - /* + /* * Interrupt aggregation: To reduce total number of interrupts * group response interrupt with data interrupt when possible. * If there going to be data interrupt, mask response one. @@ -994,6 +1002,8 @@ static void sdhci_finish_command(struct sdhci_slot *slot) { int i; + uint32_t val; + uint8_t extra; slot->cmd_done = 1; /* Interrupt aggregation: Restore command interrupt. @@ -1011,13 +1021,14 @@ sdhci_finish_command(struct sdhci_slot *slot) if (slot->curcmd->flags & MMC_RSP_PRESENT) { if (slot->curcmd->flags & MMC_RSP_136) { /* CRC is stripped so we need one byte shift. */ - uint8_t extra = 0; + extra = 0; for (i = 0; i < 4; i++) { - uint32_t val = RD4(slot, SDHCI_RESPONSE + i * 4); - if (slot->quirks & SDHCI_QUIRK_DONT_SHIFT_RESPONSE) + val = RD4(slot, SDHCI_RESPONSE + i * 4); + if (slot->quirks & + SDHCI_QUIRK_DONT_SHIFT_RESPONSE) slot->curcmd->resp[3 - i] = val; else { - slot->curcmd->resp[3 - i] = + slot->curcmd->resp[3 - i] = (val << 8) | extra; extra = val >> 24; } @@ -1056,7 +1067,7 @@ sdhci_start_data(struct sdhci_slot *slot, struct mmc_data *data) current_timeout <<= 1; } /* Compensate for an off-by-one error in the CaFe chip.*/ - if (div < 0xE && + if (div < 0xE && (slot->quirks & SDHCI_QUIRK_INCR_TIMEOUT_CONTROL)) { ++div; } @@ -1080,13 +1091,13 @@ sdhci_start_data(struct sdhci_slot *slot, struct mmc_data *data) /* Load DMA buffer. */ if (slot->flags & SDHCI_USE_DMA) { if (data->flags & MMC_DATA_READ) - bus_dmamap_sync(slot->dmatag, slot->dmamap, + bus_dmamap_sync(slot->dmatag, slot->dmamap, BUS_DMASYNC_PREREAD); else { memcpy(slot->dmamem, data->data, - (data->len < DMA_BLOCK_SIZE) ? + (data->len < DMA_BLOCK_SIZE) ? data->len : DMA_BLOCK_SIZE); - bus_dmamap_sync(slot->dmatag, slot->dmamap, + bus_dmamap_sync(slot->dmatag, slot->dmamap, BUS_DMASYNC_PREWRITE); } WR4(slot, SDHCI_DMA_ADDRESS, slot->paddr); @@ -1101,8 +1112,8 @@ sdhci_start_data(struct sdhci_slot *slot, struct mmc_data *data) /* Current data offset for both PIO and DMA. */ slot->offset = 0; /* Set block size and request IRQ on 4K border. */ - WR2(slot, SDHCI_BLOCK_SIZE, - SDHCI_MAKE_BLKSZ(DMA_BOUNDARY, (data->len < 512)?data->len:512)); + WR2(slot, SDHCI_BLOCK_SIZE, SDHCI_MAKE_BLKSZ(DMA_BOUNDARY, + (data->len < 512) ? data->len : 512)); /* Set block count. */ WR2(slot, SDHCI_BLOCK_COUNT, (data->len + 511) / 512); } @@ -1123,12 +1134,12 @@ sdhci_finish_data(struct sdhci_slot *slot) if (!slot->data_done && (slot->flags & SDHCI_USE_DMA)) { if (data->flags & MMC_DATA_READ) { size_t left = data->len - slot->offset; - bus_dmamap_sync(slot->dmatag, slot->dmamap, + bus_dmamap_sync(slot->dmatag, slot->dmamap, BUS_DMASYNC_POSTREAD); memcpy((u_char*)data->data + slot->offset, slot->dmamem, - (left < DMA_BLOCK_SIZE)?left:DMA_BLOCK_SIZE); + (left < DMA_BLOCK_SIZE) ? left : DMA_BLOCK_SIZE); } else - bus_dmamap_sync(slot->dmatag, slot->dmamap, + bus_dmamap_sync(slot->dmatag, slot->dmamap, BUS_DMASYNC_POSTWRITE); } slot->data_done = 1; @@ -1187,9 +1198,10 @@ sdhci_generic_request(device_t brdev, device_t reqdev, struct mmc_request *req) return (EBUSY); } if (sdhci_debug > 1) { - slot_printf(slot, "CMD%u arg %#x flags %#x dlen %u dflags %#x\n", - req->cmd->opcode, req->cmd->arg, req->cmd->flags, - (req->cmd->data)?(u_int)req->cmd->data->len:0, + slot_printf(slot, + "CMD%u arg %#x flags %#x dlen %u dflags %#x\n", + req->cmd->opcode, req->cmd->arg, req->cmd->flags, + (req->cmd->data)?(u_int)req->cmd->data->len:0, (req->cmd->data)?req->cmd->data->flags:0); } slot->req = req; @@ -1270,6 +1282,8 @@ sdhci_cmd_irq(struct sdhci_slot *slot, uint32_t intmask) static void sdhci_data_irq(struct sdhci_slot *slot, uint32_t intmask) { + struct mmc_data *data; + size_t left; if (!slot->curcmd) { slot_printf(slot, "Got data interrupt 0x%08x, but " @@ -1304,17 +1318,17 @@ sdhci_data_irq(struct sdhci_slot *slot, uint32_t intmask) /* Handle PIO interrupt. */ if (intmask & (SDHCI_INT_DATA_AVAIL | SDHCI_INT_SPACE_AVAIL)) { - if ((slot->opt & SDHCI_PLATFORM_TRANSFER) && + if ((slot->opt & SDHCI_PLATFORM_TRANSFER) && SDHCI_PLATFORM_WILL_HANDLE(slot->bus, slot)) { - SDHCI_PLATFORM_START_TRANSFER(slot->bus, slot, &intmask); + SDHCI_PLATFORM_START_TRANSFER(slot->bus, slot, + &intmask); slot->flags |= PLATFORM_DATA_STARTED; } else sdhci_transfer_pio(slot); } /* Handle DMA border. */ if (intmask & SDHCI_INT_DMA_END) { - struct mmc_data *data = slot->curcmd->data; - size_t left; + data = slot->curcmd->data; /* Unload DMA buffer... */ left = data->len - slot->offset; @@ -1322,7 +1336,7 @@ sdhci_data_irq(struct sdhci_slot *slot, uint32_t intmask) bus_dmamap_sync(slot->dmatag, slot->dmamap, BUS_DMASYNC_POSTREAD); memcpy((u_char*)data->data + slot->offset, slot->dmamem, - (left < DMA_BLOCK_SIZE)?left:DMA_BLOCK_SIZE); + (left < DMA_BLOCK_SIZE) ? left : DMA_BLOCK_SIZE); } else { bus_dmamap_sync(slot->dmatag, slot->dmamap, BUS_DMASYNC_POSTWRITE); @@ -1335,7 +1349,7 @@ sdhci_data_irq(struct sdhci_slot *slot, uint32_t intmask) BUS_DMASYNC_PREREAD); } else { memcpy(slot->dmamem, (u_char*)data->data + slot->offset, - (left < DMA_BLOCK_SIZE)?left:DMA_BLOCK_SIZE); + (left < DMA_BLOCK_SIZE)? left : DMA_BLOCK_SIZE); bus_dmamap_sync(slot->dmatag, slot->dmamap, BUS_DMASYNC_PREWRITE); } @@ -1363,7 +1377,6 @@ done: SDHCI_PLATFORM_FINISH_TRANSFER(slot->bus, slot); } else sdhci_finish_data(slot); - return; } } @@ -1371,7 +1384,7 @@ static void sdhci_acmd_irq(struct sdhci_slot *slot) { uint16_t err; - + err = RD4(slot, SDHCI_ACMD12_ERR); if (!slot->curcmd) { slot_printf(slot, "Got AutoCMD12 error 0x%04x, but " @@ -1387,7 +1400,7 @@ void sdhci_generic_intr(struct sdhci_slot *slot) { uint32_t intmask, present; - + SDHCI_LOCK(slot); /* Read slot interrupt status. */ intmask = RD4(slot, SDHCI_INT_STATUS); @@ -1407,7 +1420,7 @@ sdhci_generic_intr(struct sdhci_slot *slot) SDHCI_INT_CARD_INSERT; WR4(slot, SDHCI_INT_ENABLE, slot->intmask); WR4(slot, SDHCI_SIGNAL_ENABLE, slot->intmask); - WR4(slot, SDHCI_INT_STATUS, intmask & + WR4(slot, SDHCI_INT_STATUS, intmask & (SDHCI_INT_CARD_INSERT | SDHCI_INT_CARD_REMOVE)); sdhci_handle_card_present_locked(slot, present); intmask &= ~(SDHCI_INT_CARD_INSERT | SDHCI_INT_CARD_REMOVE); @@ -1446,12 +1459,13 @@ sdhci_generic_intr(struct sdhci_slot *slot) intmask); sdhci_dumpregs(slot); } - + SDHCI_UNLOCK(slot); } int -sdhci_generic_read_ivar(device_t bus, device_t child, int which, uintptr_t *result) +sdhci_generic_read_ivar(device_t bus, device_t child, int which, + uintptr_t *result) { struct sdhci_slot *slot = device_get_ivars(child); @@ -1505,7 +1519,8 @@ sdhci_generic_read_ivar(device_t bus, device_t child, int which, uintptr_t *resu } int -sdhci_generic_write_ivar(device_t bus, device_t child, int which, uintptr_t value) +sdhci_generic_write_ivar(device_t bus, device_t child, int which, + uintptr_t value) { struct sdhci_slot *slot = device_get_ivars(child); diff --git a/sys/dev/sdhci/sdhci.h b/sys/dev/sdhci/sdhci.h index 4626816a538c..9c9f831fb8bd 100644 --- a/sys/dev/sdhci/sdhci.h +++ b/sys/dev/sdhci/sdhci.h @@ -130,7 +130,7 @@ #define SDHCI_STATE_DAT_MASK 0x00f00000 #define SDHCI_STATE_CMD 0x01000000 -#define SDHCI_HOST_CONTROL 0x28 +#define SDHCI_HOST_CONTROL 0x28 #define SDHCI_CTRL_LED 0x01 #define SDHCI_CTRL_4BITBUS 0x02 #define SDHCI_CTRL_HISPD 0x04 @@ -204,7 +204,7 @@ #define SDHCI_INT_NORMAL_MASK 0x00007FFF #define SDHCI_INT_ERROR_MASK 0xFFFF8000 -#define SDHCI_INT_CMD_ERROR_MASK (SDHCI_INT_TIMEOUT | \ +#define SDHCI_INT_CMD_ERROR_MASK (SDHCI_INT_TIMEOUT | \ SDHCI_INT_CRC | SDHCI_INT_END_BIT | SDHCI_INT_INDEX) #define SDHCI_INT_CMD_MASK (SDHCI_INT_RESPONSE | SDHCI_INT_CMD_ERROR_MASK) @@ -288,19 +288,19 @@ struct sdhci_slot { int timeout; /* Transfer timeout */ uint32_t max_clk; /* Max possible freq */ uint32_t timeout_clk; /* Timeout freq */ - bus_dma_tag_t dmatag; - bus_dmamap_t dmamap; + bus_dma_tag_t dmatag; + bus_dmamap_t dmamap; u_char *dmamem; bus_addr_t paddr; /* DMA buffer address */ struct task card_task; /* Card presence check task */ - struct timeout_task + struct timeout_task card_delayed_task;/* Card insert delayed task */ struct callout card_poll_callout;/* Card present polling callout */ struct callout timeout_callout;/* Card command/data response timeout */ struct mmc_host host; /* Host parameters */ struct mmc_request *req; /* Current request */ struct mmc_command *curcmd; /* Current command of current request */ - + uint32_t intmask; /* Current interrupt mask */ uint32_t clock; /* Current clock freq. */ size_t offset; /* Data buffer offset */ @@ -313,12 +313,14 @@ struct sdhci_slot { #define CMD_STARTED 1 #define STOP_STARTED 2 #define SDHCI_USE_DMA 4 /* Use DMA for this req. */ -#define PLATFORM_DATA_STARTED 8 /* Data transfer is handled by platform */ +#define PLATFORM_DATA_STARTED 8 /* Data xfer is handled by platform */ struct mtx mtx; /* Slot mutex */ }; -int sdhci_generic_read_ivar(device_t bus, device_t child, int which, uintptr_t *result); -int sdhci_generic_write_ivar(device_t bus, device_t child, int which, uintptr_t value); +int sdhci_generic_read_ivar(device_t bus, device_t child, int which, + uintptr_t *result); +int sdhci_generic_write_ivar(device_t bus, device_t child, int which, + uintptr_t value); int sdhci_init_slot(device_t dev, struct sdhci_slot *slot, int num); void sdhci_start_slot(struct sdhci_slot *slot); /* performs generic clean-up for platform transfers */ @@ -327,7 +329,8 @@ int sdhci_cleanup_slot(struct sdhci_slot *slot); int sdhci_generic_suspend(struct sdhci_slot *slot); int sdhci_generic_resume(struct sdhci_slot *slot); int sdhci_generic_update_ios(device_t brdev, device_t reqdev); -int sdhci_generic_request(device_t brdev, device_t reqdev, struct mmc_request *req); +int sdhci_generic_request(device_t brdev, device_t reqdev, + struct mmc_request *req); int sdhci_generic_get_ro(device_t brdev, device_t reqdev); int sdhci_generic_acquire_host(device_t brdev, device_t reqdev); int sdhci_generic_release_host(device_t brdev, device_t reqdev); diff --git a/sys/dev/sdhci/sdhci_acpi.c b/sys/dev/sdhci/sdhci_acpi.c index a2a2cab0ffd2..a0560ecd8467 100644 --- a/sys/dev/sdhci/sdhci_acpi.c +++ b/sys/dev/sdhci/sdhci_acpi.c @@ -77,7 +77,7 @@ static char *sdhci_ids[] = { struct sdhci_acpi_softc { u_int quirks; /* Chip specific quirks */ struct resource *irq_res; /* IRQ resource */ - void *intrhand; /* Interrupt handle */ + void *intrhand; /* Interrupt handle */ struct sdhci_slot slot; struct resource *mem_res; /* Memory resource */ @@ -97,7 +97,8 @@ sdhci_acpi_read_1(device_t dev, struct sdhci_slot *slot, bus_size_t off) } static void -sdhci_acpi_write_1(device_t dev, struct sdhci_slot *slot, bus_size_t off, uint8_t val) +sdhci_acpi_write_1(device_t dev, struct sdhci_slot *slot, bus_size_t off, + uint8_t val) { struct sdhci_acpi_softc *sc = device_get_softc(dev); @@ -117,7 +118,8 @@ sdhci_acpi_read_2(device_t dev, struct sdhci_slot *slot, bus_size_t off) } static void -sdhci_acpi_write_2(device_t dev, struct sdhci_slot *slot, bus_size_t off, uint16_t val) +sdhci_acpi_write_2(device_t dev, struct sdhci_slot *slot, bus_size_t off, + uint16_t val) { struct sdhci_acpi_softc *sc = device_get_softc(dev); @@ -137,7 +139,8 @@ sdhci_acpi_read_4(device_t dev, struct sdhci_slot *slot, bus_size_t off) } static void -sdhci_acpi_write_4(device_t dev, struct sdhci_slot *slot, bus_size_t off, uint32_t val) +sdhci_acpi_write_4(device_t dev, struct sdhci_slot *slot, bus_size_t off, + uint32_t val) { struct sdhci_acpi_softc *sc = device_get_softc(dev); @@ -237,7 +240,7 @@ sdhci_acpi_attach(device_t dev) sdhci_acpi_detach(dev); return (ENOMEM); } - + sc->slot.quirks = sc->quirks; err = sdhci_init_slot(dev, &sc->slot, 0); @@ -337,9 +340,9 @@ static device_method_t sdhci_methods[] = { DEVMETHOD(bus_write_ivar, sdhci_generic_write_ivar), /* mmcbr_if */ - DEVMETHOD(mmcbr_update_ios, sdhci_generic_update_ios), - DEVMETHOD(mmcbr_request, sdhci_generic_request), - DEVMETHOD(mmcbr_get_ro, sdhci_generic_get_ro), + DEVMETHOD(mmcbr_update_ios, sdhci_generic_update_ios), + DEVMETHOD(mmcbr_request, sdhci_generic_request), + DEVMETHOD(mmcbr_get_ro, sdhci_generic_get_ro), DEVMETHOD(mmcbr_acquire_host, sdhci_generic_acquire_host), DEVMETHOD(mmcbr_release_host, sdhci_generic_release_host), diff --git a/sys/dev/sdhci/sdhci_pci.c b/sys/dev/sdhci/sdhci_pci.c index aec4000dc168..2e6961a3f9fd 100644 --- a/sys/dev/sdhci/sdhci_pci.c +++ b/sys/dev/sdhci/sdhci_pci.c @@ -81,28 +81,28 @@ static const struct sdhci_device { const char *desc; u_int quirks; } sdhci_devices[] = { - { 0x08221180, 0xffff, "RICOH R5C822 SD", + { 0x08221180, 0xffff, "RICOH R5C822 SD", SDHCI_QUIRK_FORCE_DMA }, - { 0xe8221180, 0xffff, "RICOH R5CE822 SD", + { 0xe8221180, 0xffff, "RICOH R5CE822 SD", SDHCI_QUIRK_FORCE_DMA | SDHCI_QUIRK_LOWER_FREQUENCY }, - { 0xe8231180, 0xffff, "RICOH R5CE823 SD", + { 0xe8231180, 0xffff, "RICOH R5CE823 SD", SDHCI_QUIRK_LOWER_FREQUENCY }, - { 0x8034104c, 0xffff, "TI XX21/XX11 SD", + { 0x8034104c, 0xffff, "TI XX21/XX11 SD", SDHCI_QUIRK_FORCE_DMA }, - { 0x05501524, 0xffff, "ENE CB712 SD", + { 0x05501524, 0xffff, "ENE CB712 SD", SDHCI_QUIRK_BROKEN_TIMINGS }, - { 0x05511524, 0xffff, "ENE CB712 SD 2", + { 0x05511524, 0xffff, "ENE CB712 SD 2", SDHCI_QUIRK_BROKEN_TIMINGS }, - { 0x07501524, 0xffff, "ENE CB714 SD", + { 0x07501524, 0xffff, "ENE CB714 SD", SDHCI_QUIRK_RESET_ON_IOS | SDHCI_QUIRK_BROKEN_TIMINGS }, - { 0x07511524, 0xffff, "ENE CB714 SD 2", + { 0x07511524, 0xffff, "ENE CB714 SD 2", SDHCI_QUIRK_RESET_ON_IOS | SDHCI_QUIRK_BROKEN_TIMINGS }, - { 0x410111ab, 0xffff, "Marvell CaFe SD", + { 0x410111ab, 0xffff, "Marvell CaFe SD", SDHCI_QUIRK_INCR_TIMEOUT_CONTROL }, - { 0x2381197B, 0xffff, "JMicron JMB38X SD", + { 0x2381197B, 0xffff, "JMicron JMB38X SD", SDHCI_QUIRK_32BIT_DMA_SIZE | SDHCI_QUIRK_RESET_AFTER_REQUEST }, { 0x16bc14e4, 0xffff, "Broadcom BCM577xx SDXC/MMC Card Reader", @@ -127,7 +127,7 @@ static const struct sdhci_device { struct sdhci_pci_softc { u_int quirks; /* Chip specific quirks */ struct resource *irq_res; /* IRQ resource */ - void *intrhand; /* Interrupt handle */ + void *intrhand; /* Interrupt handle */ int num_slots; /* Number of slots on this controller */ struct sdhci_slot slots[6]; @@ -151,7 +151,8 @@ sdhci_pci_read_1(device_t dev, struct sdhci_slot *slot, bus_size_t off) } static void -sdhci_pci_write_1(device_t dev, struct sdhci_slot *slot, bus_size_t off, uint8_t val) +sdhci_pci_write_1(device_t dev, struct sdhci_slot *slot, bus_size_t off, + uint8_t val) { struct sdhci_pci_softc *sc = device_get_softc(dev); @@ -171,7 +172,8 @@ sdhci_pci_read_2(device_t dev, struct sdhci_slot *slot, bus_size_t off) } static void -sdhci_pci_write_2(device_t dev, struct sdhci_slot *slot, bus_size_t off, uint16_t val) +sdhci_pci_write_2(device_t dev, struct sdhci_slot *slot, bus_size_t off, + uint16_t val) { struct sdhci_pci_softc *sc = device_get_softc(dev); @@ -191,7 +193,8 @@ sdhci_pci_read_4(device_t dev, struct sdhci_slot *slot, bus_size_t off) } static void -sdhci_pci_write_4(device_t dev, struct sdhci_slot *slot, bus_size_t off, uint32_t val) +sdhci_pci_write_4(device_t dev, struct sdhci_slot *slot, bus_size_t off, + uint32_t val) { struct sdhci_pci_softc *sc = device_get_softc(dev); @@ -346,7 +349,8 @@ sdhci_pci_attach(device_t dev) sc->mem_res[i] = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid, RF_ACTIVE); if (sc->mem_res[i] == NULL) { - device_printf(dev, "Can't allocate memory for slot %d\n", i); + device_printf(dev, + "Can't allocate memory for slot %d\n", i); continue; } @@ -463,9 +467,9 @@ static device_method_t sdhci_methods[] = { DEVMETHOD(bus_write_ivar, sdhci_generic_write_ivar), /* mmcbr_if */ - DEVMETHOD(mmcbr_update_ios, sdhci_generic_update_ios), - DEVMETHOD(mmcbr_request, sdhci_generic_request), - DEVMETHOD(mmcbr_get_ro, sdhci_generic_get_ro), + DEVMETHOD(mmcbr_update_ios, sdhci_generic_update_ios), + DEVMETHOD(mmcbr_request, sdhci_generic_request), + DEVMETHOD(mmcbr_get_ro, sdhci_generic_get_ro), DEVMETHOD(mmcbr_acquire_host, sdhci_generic_acquire_host), DEVMETHOD(mmcbr_release_host, sdhci_generic_release_host), diff --git a/sys/dev/sio/sio_pccard.c b/sys/dev/sio/sio_pccard.c index 7bdb755d8051..93757c73870c 100644 --- a/sys/dev/sio/sio_pccard.c +++ b/sys/dev/sio/sio_pccard.c @@ -87,9 +87,6 @@ sio_pccard_attach(device_t dev) { int err; -#ifdef PC98 - SET_FLAG(dev, SET_IFTYPE(COM_IF_MODEM_CARD)); -#endif /* Do not probe IRQ - pccard doesn't turn on the interrupt line */ /* until bus_setup_intr */ if ((err = sioprobe(dev, 0, 0UL, 1)) > 0) diff --git a/sys/dev/sio/sio_pci.c b/sys/dev/sio/sio_pci.c index a693536d33cd..34010acada1e 100644 --- a/sys/dev/sio/sio_pci.c +++ b/sys/dev/sio/sio_pci.c @@ -118,9 +118,7 @@ sio_pci_probe(dev) if (id->desc == NULL) return (ENXIO); device_set_desc(dev, id->desc); -#ifdef PC98 - SET_FLAG(dev, SET_IFTYPE(COM_IF_NS16550)); -#endif + return (sioprobe(dev, id->rid, 0UL, 0)); } diff --git a/sys/dev/sio/sio_puc.c b/sys/dev/sio/sio_puc.c index 0ae0e7d6424d..199254b08201 100644 --- a/sys/dev/sio/sio_puc.c +++ b/sys/dev/sio/sio_puc.c @@ -89,9 +89,7 @@ sio_puc_probe(device_t dev) if (BUS_READ_IVAR(parent, dev, PUC_IVAR_CLOCK, &rclk)) rclk = DEFAULT_RCLK; -#ifdef PC98 - SET_FLAG(dev, SET_IFTYPE(COM_IF_NS16550)); -#endif + error = sioprobe(dev, 0, rclk, 1); return ((error > 0) ? error : BUS_PROBE_LOW_PRIORITY); } diff --git a/sys/dev/sio/siovar.h b/sys/dev/sio/siovar.h index 22a6019d8e62..1a0abddf7a09 100644 --- a/sys/dev/sio/siovar.h +++ b/sys/dev/sio/siovar.h @@ -29,36 +29,6 @@ * $FreeBSD$ */ -#ifdef PC98 -#define COM_IF_INTERNAL 0x00 -#define COM_IF_PC9861K_1 0x01 -#define COM_IF_PC9861K_2 0x02 -#define COM_IF_IND_SS_1 0x03 -#define COM_IF_IND_SS_2 0x04 -#define COM_IF_PIO9032B_1 0x05 -#define COM_IF_PIO9032B_2 0x06 -#define COM_IF_B98_01_1 0x07 -#define COM_IF_B98_01_2 0x08 -#define COM_IF_END1 COM_IF_B98_01_2 -#define COM_IF_RSA98 0x10 /* same as COM_IF_NS16550 */ -#define COM_IF_NS16550 0x11 -#define COM_IF_SECOND_CCU 0x12 /* same as COM_IF_NS16550 */ -#define COM_IF_MC16550II 0x13 -#define COM_IF_MCRS98 0x14 /* same as COM_IF_MC16550II */ -#define COM_IF_RSB3000 0x15 -#define COM_IF_RSB384 0x16 -#define COM_IF_MODEM_CARD 0x17 -#define COM_IF_RSA98III 0x18 -#define COM_IF_ESP98 0x19 -#define COM_IF_END2 COM_IF_ESP98 - -#define GET_IFTYPE(type) (((type) >> 24) & 0x1f) -#define SET_IFTYPE(type) ((type) << 24) - -#define SET_FLAG(dev, bit) device_set_flags(dev, device_get_flags(dev) | (bit)) -#define CLR_FLAG(dev, bit) device_set_flags(dev, device_get_flags(dev) & ~(bit)) -#endif /* PC98 */ - int sioattach(device_t dev, int xrid, u_long rclk); int siodetach(device_t dev); int sioprobe(device_t dev, int xrid, u_long rclk, int noprobe); diff --git a/sys/dev/snc/dp83932.c b/sys/dev/snc/dp83932.c deleted file mode 100644 index acda11c2c00f..000000000000 --- a/sys/dev/snc/dp83932.c +++ /dev/null @@ -1,1198 +0,0 @@ -/* $FreeBSD$ */ -/* $NecBSD: dp83932.c,v 1.5 1999/07/29 05:08:44 kmatsuda Exp $ */ -/* $NetBSD: if_snc.c,v 1.18 1998/04/25 21:27:40 scottr Exp $ */ - -/*- - * Copyright (c) 1997, 1998, 1999 - * Kouichi Matsuda. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by Kouichi Matsuda for - * NetBSD/pc98. - * 4. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/* - * Modified for FreeBSD(98) 4.0 from NetBSD/pc98 1.4.2 by Motomichi Matsuzaki. - */ - -/* - * Modified for NetBSD/pc98 1.2G from NetBSD/mac68k 1.2G by Kouichi Matsuda. - * Make adapted for NEC PC-9801-83, 84, PC-9801-103, 104, PC-9801N-25 and - * PC-9801N-J02, J02R, which uses National Semiconductor DP83934AVQB as - * Ethernet Controller and National Semiconductor NS46C46 as - * (64 * 16 bits) Microwire Serial EEPROM. - */ - -/*- - * National Semiconductor DP8393X SONIC Driver - * Copyright (c) 1991 Algorithmics Ltd (http://www.algor.co.uk) - * You may use, copy, and modify this program so long as you retain the - * copyright line. - * - * This driver has been substantially modified since Algorithmics donated - * it. - * - * Denton Gentry <denny1@home.com> - * and also - * Yanagisawa Takeshi <yanagisw@aa.ap.titech.ac.jp> - * did the work to get this running on the Macintosh. - */ - -#include "opt_inet.h" - -#include <sys/param.h> -#include <sys/kernel.h> -#include <sys/systm.h> -#include <sys/sockio.h> -#include <sys/mbuf.h> -#include <sys/protosw.h> -#include <sys/socket.h> -#include <sys/syslog.h> -#include <sys/errno.h> - -#include <net/ethernet.h> -#include <net/if.h> -#include <net/if_var.h> -#include <net/if_arp.h> -#include <net/if_dl.h> -#include <net/if_media.h> -#include <net/if_types.h> - -#include <net/bpf.h> - -#include <sys/bus.h> -#include <machine/bus.h> -#include <dev/snc/dp83932reg.h> -#include <dev/snc/dp83932var.h> - -static void sncwatchdog(void *); -static void sncinit(void *); -static void sncinit_locked(struct snc_softc *); -static int sncstop(struct snc_softc *sc); -static int sncioctl(struct ifnet *ifp, u_long cmd, caddr_t data); -static void sncstart(struct ifnet *ifp); -static void sncstart_locked(struct ifnet *ifp); -static void sncreset(struct snc_softc *sc); - -static void caminitialise(struct snc_softc *); -static void camentry(struct snc_softc *, int, u_char *ea); -static void camprogram(struct snc_softc *); -static void initialise_tda(struct snc_softc *); -static void initialise_rda(struct snc_softc *); -static void initialise_rra(struct snc_softc *); -#ifdef SNCDEBUG -static void camdump(struct snc_softc *sc); -#endif - -static void sonictxint(struct snc_softc *); -static void sonicrxint(struct snc_softc *); - -static u_int sonicput(struct snc_softc *sc, struct mbuf *m0, int mtd_next); -static int sonic_read(struct snc_softc *, u_int32_t, int); -static struct mbuf *sonic_get(struct snc_softc *, u_int32_t, int); - -int snc_enable(struct snc_softc *); -void snc_disable(struct snc_softc *); - -int snc_mediachange(struct ifnet *); -void snc_mediastatus(struct ifnet *, struct ifmediareq *); - -#undef assert -#undef _assert - -#ifdef NDEBUG -#define assert(e) ((void)0) -#define _assert(e) ((void)0) -#else -#define _assert(e) assert(e) -#ifdef __STDC__ -#define assert(e) ((e) ? (void)0 : __assert("snc ", __FILE__, __LINE__, #e)) -#else /* PCC */ -#define assert(e) ((e) ? (void)0 : __assert("snc "__FILE__, __LINE__, "e")) -#endif -#endif - -#ifdef SNCDEBUG -#define SNC_SHOWTXHDR 0x01 /* show tx ether_header */ -#define SNC_SHOWRXHDR 0x02 /* show rx ether_header */ -#define SNC_SHOWCAMENT 0x04 /* show CAM entry */ -#endif /* SNCDEBUG */ -int sncdebug = 0; - - -int -sncconfig(struct snc_softc *sc, int *media, int nmedia, int defmedia, - u_int8_t *myea) -{ - struct ifnet *ifp; - int i; - -#ifdef SNCDEBUG - if ((sncdebug & SNC_SHOWCAMENT) != 0) { - camdump(sc); - } -#endif - - ifp = sc->sc_ifp = if_alloc(IFT_ETHER); - if (ifp == NULL) { - device_printf(sc->sc_dev, "can not if_alloc()\n"); - return (ENOMEM); - } - -#ifdef SNCDEBUG - device_printf(sc->sc_dev, - "buffers: rra=0x%x cda=0x%x rda=0x%x tda=0x%x\n", - sc->v_rra[0], sc->v_cda, - sc->v_rda, sc->mtda[0].mtd_vtxp); -#endif - - ifp->if_softc = sc; - if_initname(ifp, device_get_name(sc->sc_dev), - device_get_unit(sc->sc_dev)); - ifp->if_ioctl = sncioctl; - ifp->if_start = sncstart; - ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST; - ifp->if_init = sncinit; - IFQ_SET_MAXLEN(&ifp->if_snd, ifqmaxlen); - - /* Initialize media goo. */ - ifmedia_init(&sc->sc_media, 0, snc_mediachange, - snc_mediastatus); - if (media != NULL) { - for (i = 0; i < nmedia; i++) - ifmedia_add(&sc->sc_media, media[i], 0, NULL); - ifmedia_set(&sc->sc_media, defmedia); - } else { - ifmedia_add(&sc->sc_media, IFM_ETHER|IFM_MANUAL, 0, NULL); - ifmedia_set(&sc->sc_media, IFM_ETHER|IFM_MANUAL); - } - - ether_ifattach(ifp, myea); - return (0); -} - -void -sncshutdown(void *arg) -{ - struct snc_softc *sc = arg; - - SNC_ASSERT_LOCKED(sc); - sncstop(sc); -} - -/* - * Media change callback. - */ -int -snc_mediachange(struct ifnet *ifp) -{ - struct snc_softc *sc = ifp->if_softc; - int error; - - SNC_LOCK(sc); - if (sc->sc_mediachange) - error = (*sc->sc_mediachange)(sc); - else - error = EINVAL; - SNC_UNLOCK(sc); - return (error); -} - -/* - * Media status callback. - */ -void -snc_mediastatus(struct ifnet *ifp, struct ifmediareq *ifmr) -{ - struct snc_softc *sc = ifp->if_softc; - - SNC_LOCK(sc); - if (sc->sc_enabled == 0) { - ifmr->ifm_active = IFM_ETHER | IFM_NONE; - ifmr->ifm_status = 0; - SNC_UNLOCK(sc); - return; - } - - if (sc->sc_mediastatus) - (*sc->sc_mediastatus)(sc, ifmr); - SNC_UNLOCK(sc); -} - - -static int -sncioctl(struct ifnet *ifp, u_long cmd, caddr_t data) -{ - struct ifreq *ifr; - struct snc_softc *sc = ifp->if_softc; - int err = 0; - - switch (cmd) { - - case SIOCSIFFLAGS: - SNC_LOCK(sc); - if ((ifp->if_flags & IFF_UP) == 0 && - (ifp->if_drv_flags & IFF_DRV_RUNNING) != 0) { - /* - * If interface is marked down and it is running, - * then stop it. - */ - sncstop(sc); - snc_disable(sc); - } else if ((ifp->if_flags & IFF_UP) != 0 && - (ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) { - /* - * If interface is marked up and it is stopped, - * then start it. - */ - if ((err = snc_enable(sc)) != 0) - break; - sncinit_locked(sc); - } else if (sc->sc_enabled) { - /* - * reset the interface to pick up any other changes - * in flags - */ - sncreset(sc); - sncstart_locked(ifp); - } - SNC_UNLOCK(sc); - break; - - case SIOCADDMULTI: - case SIOCDELMULTI: - SNC_LOCK(sc); - if (sc->sc_enabled == 0) { - err = EIO; - SNC_UNLOCK(sc); - break; - } - sncreset(sc); - SNC_UNLOCK(sc); - err = 0; - break; - case SIOCGIFMEDIA: - case SIOCSIFMEDIA: - ifr = (struct ifreq *) data; - err = ifmedia_ioctl(ifp, ifr, &sc->sc_media, cmd); - break; - default: - err = ether_ioctl(ifp, cmd, data); - break; - } - return (err); -} - -/* - * Encapsulate a packet of type family for the local net. - */ -static void -sncstart(struct ifnet *ifp) -{ - struct snc_softc *sc = ifp->if_softc; - - SNC_LOCK(sc); - sncstart_locked(ifp); - SNC_UNLOCK(sc); -} - -static void -sncstart_locked(struct ifnet *ifp) -{ - struct snc_softc *sc = ifp->if_softc; - struct mbuf *m; - int mtd_next; - - if ((ifp->if_drv_flags & (IFF_DRV_RUNNING | IFF_DRV_OACTIVE)) != - IFF_DRV_RUNNING) - return; - -outloop: - /* Check for room in the xmit buffer. */ - if ((mtd_next = (sc->mtd_free + 1)) == NTDA) - mtd_next = 0; - - if (mtd_next == sc->mtd_hw) { - ifp->if_drv_flags |= IFF_DRV_OACTIVE; - return; - } - - IF_DEQUEUE(&ifp->if_snd, m); - if (m == 0) - return; - - /* We need the header for m_pkthdr.len. */ - M_ASSERTPKTHDR(m); - - /* - * If there is nothing in the o/p queue, and there is room in - * the Tx ring, then send the packet directly. Otherwise append - * it to the o/p queue. - */ - if ((sonicput(sc, m, mtd_next)) == 0) { - IF_PREPEND(&ifp->if_snd, m); - return; - } - - /* - * If bpf is listening on this interface, let it see the packet - * before we commit it to the wire, but only if we are really - * committed to send it. - * - * XXX: Locking must protect m against premature m_freem() in - * sonictxint(). - */ - BPF_MTAP(ifp, m); - - sc->mtd_prev = sc->mtd_free; - sc->mtd_free = mtd_next; - - if_inc_counter(ifp, IFCOUNTER_OPACKETS, 1); /* # of pkts */ - - /* Jump back for possibly more punishment. */ - goto outloop; -} - -/* - * reset and restart the SONIC. Called in case of fatal - * hardware/software errors. - */ -static void -sncreset(struct snc_softc *sc) -{ - sncstop(sc); - sncinit_locked(sc); -} - -static void -sncinit(void *xsc) -{ - struct snc_softc *sc = xsc; - - SNC_LOCK(sc); - sncinit_locked(sc); - SNC_UNLOCK(sc); -} - -static void -sncinit_locked(struct snc_softc *sc) -{ - u_long s_rcr; - - if (sc->sc_ifp->if_drv_flags & IFF_DRV_RUNNING) - /* already running */ - return; - - NIC_PUT(sc, SNCR_CR, CR_RST); /* DCR only accessible in reset mode! */ - - /* config it */ - NIC_PUT(sc, SNCR_DCR, (sc->sncr_dcr | - (sc->bitmode ? DCR_DW32 : DCR_DW16))); - NIC_PUT(sc, SNCR_DCR2, sc->sncr_dcr2); - - s_rcr = RCR_BRD | RCR_LBNONE; - if (sc->sc_ifp->if_flags & IFF_PROMISC) - s_rcr |= RCR_PRO; - if (sc->sc_ifp->if_flags & IFF_ALLMULTI) - s_rcr |= RCR_AMC; - NIC_PUT(sc, SNCR_RCR, s_rcr); - - NIC_PUT(sc, SNCR_IMR, (IMR_PRXEN | IMR_PTXEN | IMR_TXEREN | IMR_LCDEN)); - - /* clear pending interrupts */ - NIC_PUT(sc, SNCR_ISR, ISR_ALL); - - /* clear tally counters */ - NIC_PUT(sc, SNCR_CRCT, -1); - NIC_PUT(sc, SNCR_FAET, -1); - NIC_PUT(sc, SNCR_MPT, -1); - - initialise_tda(sc); - initialise_rda(sc); - initialise_rra(sc); - - /* enable the chip */ - NIC_PUT(sc, SNCR_CR, 0); - wbflush(); - - /* program the CAM */ - camprogram(sc); - - /* get it to read resource descriptors */ - NIC_PUT(sc, SNCR_CR, CR_RRRA); - wbflush(); - while ((NIC_GET(sc, SNCR_CR)) & CR_RRRA) - continue; - - /* enable rx */ - NIC_PUT(sc, SNCR_CR, CR_RXEN); - wbflush(); - - /* flag interface as "running" */ - sc->sc_ifp->if_drv_flags |= IFF_DRV_RUNNING; - sc->sc_ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; - callout_reset(&sc->sc_timer, hz, sncwatchdog, sc); - - return; -} - -/* - * close down an interface and free its buffers - * Called on final close of device, or if sncinit() fails - * part way through. - */ -static int -sncstop(struct snc_softc *sc) -{ - struct mtd *mtd; - - SNC_ASSERT_LOCKED(sc); - - /* stick chip in reset */ - NIC_PUT(sc, SNCR_CR, CR_RST); - wbflush(); - - /* free all receive buffers (currently static so nothing to do) */ - - /* free all pending transmit mbufs */ - while (sc->mtd_hw != sc->mtd_free) { - mtd = &sc->mtda[sc->mtd_hw]; - if (mtd->mtd_mbuf) - m_freem(mtd->mtd_mbuf); - if (++sc->mtd_hw == NTDA) sc->mtd_hw = 0; - } - - callout_stop(&sc->sc_timer); - sc->sc_tx_timeout = 0; - sc->sc_ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE); - - return (0); -} - -/* - * Called if any Tx packets remain unsent after 5 seconds, - * In all cases we just reset the chip, and any retransmission - * will be handled by higher level protocol timeouts. - */ -static void -sncwatchdog(void *arg) -{ - struct snc_softc *sc = arg; - struct mtd *mtd; - - SNC_ASSERT_LOCKED(sc); - if (sc->sc_tx_timeout && --sc->sc_tx_timeout == 0) { - if (sc->mtd_hw != sc->mtd_free) { - /* something still pending for transmit */ - mtd = &sc->mtda[sc->mtd_hw]; - if (SRO(sc, mtd->mtd_vtxp, TXP_STATUS) == 0) - log(LOG_ERR, "%s: Tx - timeout\n", - device_get_nameunit(sc->sc_dev)); - else - log(LOG_ERR, "%s: Tx - lost interrupt\n", - device_get_nameunit(sc->sc_dev)); - sncreset(sc); - } - } - callout_reset(&sc->sc_timer, hz, sncwatchdog, sc); -} - -/* - * stuff packet into sonic - */ -static u_int -sonicput(struct snc_softc *sc, struct mbuf *m0, int mtd_next) -{ - struct mtd *mtdp; - struct mbuf *m; - u_int32_t buff; - u_int32_t txp; - u_int len = 0; - u_int totlen = 0; - -#ifdef whyonearthwouldyoudothis - if (NIC_GET(sc, SNCR_CR) & CR_TXP) - return (0); -#endif - - /* grab the replacement mtd */ - mtdp = &sc->mtda[sc->mtd_free]; - - buff = mtdp->mtd_vbuf; - - /* this packet goes to mtdnext fill in the TDA */ - mtdp->mtd_mbuf = m0; - txp = mtdp->mtd_vtxp; - - /* Write to the config word. Every (NTDA/2)+1 packets we set an intr */ - if (sc->mtd_pint == 0) { - sc->mtd_pint = NTDA/2; - SWO(sc, txp, TXP_CONFIG, TCR_PINT); - } else { - sc->mtd_pint--; - SWO(sc, txp, TXP_CONFIG, 0); - } - - for (m = m0; m; m = m->m_next) { - len = m->m_len; - totlen += len; - (*sc->sc_copytobuf)(sc, mtod(m, caddr_t), buff, len); - buff += len; - } - if (totlen >= TXBSIZE) { - panic("%s: sonicput: packet overflow", - device_get_nameunit(sc->sc_dev)); - } - - SWO(sc, txp, TXP_FRAGOFF + (0 * TXP_FRAGSIZE) + TXP_FPTRLO, - LOWER(mtdp->mtd_vbuf)); - SWO(sc, txp, TXP_FRAGOFF + (0 * TXP_FRAGSIZE) + TXP_FPTRHI, - UPPER(mtdp->mtd_vbuf)); - - if (totlen < ETHERMIN + sizeof(struct ether_header)) { - int pad = ETHERMIN + sizeof(struct ether_header) - totlen; - (*sc->sc_zerobuf)(sc, mtdp->mtd_vbuf + totlen, pad); - totlen = ETHERMIN + sizeof(struct ether_header); - } - - SWO(sc, txp, TXP_FRAGOFF + (0 * TXP_FRAGSIZE) + TXP_FSIZE, - totlen); - SWO(sc, txp, TXP_FRAGCNT, 1); - SWO(sc, txp, TXP_PKTSIZE, totlen); - - /* link onto the next mtd that will be used */ - SWO(sc, txp, TXP_FRAGOFF + (1 * TXP_FRAGSIZE) + TXP_FPTRLO, - LOWER(sc->mtda[mtd_next].mtd_vtxp) | EOL); - - /* - * The previous txp.tlink currently contains a pointer to - * our txp | EOL. Want to clear the EOL, so write our - * pointer to the previous txp. - */ - SWO(sc, sc->mtda[sc->mtd_prev].mtd_vtxp, sc->mtd_tlinko, - LOWER(mtdp->mtd_vtxp)); - - /* make sure chip is running */ - wbflush(); - NIC_PUT(sc, SNCR_CR, CR_TXP); - wbflush(); - - /* 5 seconds to watch for failing to transmit */ - sc->sc_tx_timeout = 5; - - return (totlen); -} - -/* - * These are called from sonicioctl() when /etc/ifconfig is run to set - * the address or switch the i/f on. - */ -/* - * CAM support - */ -static void -caminitialise(struct snc_softc *sc) -{ - u_int32_t v_cda = sc->v_cda; - int i; - int camoffset; - - for (i = 0; i < MAXCAM; i++) { - camoffset = i * CDA_CAMDESC; - SWO(sc, v_cda, (camoffset + CDA_CAMEP), i); - SWO(sc, v_cda, (camoffset + CDA_CAMAP2), 0); - SWO(sc, v_cda, (camoffset + CDA_CAMAP1), 0); - SWO(sc, v_cda, (camoffset + CDA_CAMAP0), 0); - } - SWO(sc, v_cda, CDA_ENABLE, 0); - -#ifdef SNCDEBUG - if ((sncdebug & SNC_SHOWCAMENT) != 0) { - camdump(sc); - } -#endif -} - -static void -camentry(struct snc_softc *sc, int entry, u_char *ea) -{ - u_int32_t v_cda = sc->v_cda; - int camoffset = entry * CDA_CAMDESC; - - SWO(sc, v_cda, camoffset + CDA_CAMEP, entry); - SWO(sc, v_cda, camoffset + CDA_CAMAP2, (ea[5] << 8) | ea[4]); - SWO(sc, v_cda, camoffset + CDA_CAMAP1, (ea[3] << 8) | ea[2]); - SWO(sc, v_cda, camoffset + CDA_CAMAP0, (ea[1] << 8) | ea[0]); - SWO(sc, v_cda, CDA_ENABLE, - (SRO(sc, v_cda, CDA_ENABLE) | (1 << entry))); -} - -static void -camprogram(struct snc_softc *sc) -{ - struct ifmultiaddr *ifma; - struct ifnet *ifp; - int timeout; - int mcount = 0; - - caminitialise(sc); - - ifp = sc->sc_ifp; - - /* Always load our own address first. */ - camentry (sc, mcount, IF_LLADDR(sc->sc_ifp)); - mcount++; - - /* Assume we won't need allmulti bit. */ - ifp->if_flags &= ~IFF_ALLMULTI; - - /* Loop through multicast addresses */ - if_maddr_rlock(ifp); - TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) { - if (ifma->ifma_addr->sa_family != AF_LINK) - continue; - if (mcount == MAXCAM) { - ifp->if_flags |= IFF_ALLMULTI; - break; - } - - /* program the CAM with the specified entry */ - camentry(sc, mcount, - LLADDR((struct sockaddr_dl *)ifma->ifma_addr)); - mcount++; - } - if_maddr_runlock(ifp); - - NIC_PUT(sc, SNCR_CDP, LOWER(sc->v_cda)); - NIC_PUT(sc, SNCR_CDC, MAXCAM); - NIC_PUT(sc, SNCR_CR, CR_LCAM); - wbflush(); - - timeout = 10000; - while ((NIC_GET(sc, SNCR_CR) & CR_LCAM) && timeout--) - continue; - if (timeout == 0) { - /* XXX */ - panic("%s: CAM initialisation failed\n", - device_get_nameunit(sc->sc_dev)); - } - timeout = 10000; - while (((NIC_GET(sc, SNCR_ISR) & ISR_LCD) == 0) && timeout--) - continue; - - if (NIC_GET(sc, SNCR_ISR) & ISR_LCD) - NIC_PUT(sc, SNCR_ISR, ISR_LCD); - else - device_printf(sc->sc_dev, - "CAM initialisation without interrupt\n"); -} - -#ifdef SNCDEBUG -static void -camdump(struct snc_softc *sc) -{ - int i; - - printf("CAM entries:\n"); - NIC_PUT(sc, SNCR_CR, CR_RST); - wbflush(); - - for (i = 0; i < 16; i++) { - u_short ap2, ap1, ap0; - NIC_PUT(sc, SNCR_CEP, i); - wbflush(); - ap2 = NIC_GET(sc, SNCR_CAP2); - ap1 = NIC_GET(sc, SNCR_CAP1); - ap0 = NIC_GET(sc, SNCR_CAP0); - printf("%d: ap2=0x%x ap1=0x%x ap0=0x%x\n", i, ap2, ap1, ap0); - } - printf("CAM enable 0x%x\n", NIC_GET(sc, SNCR_CEP)); - - NIC_PUT(sc, SNCR_CR, 0); - wbflush(); -} -#endif - -static void -initialise_tda(struct snc_softc *sc) -{ - struct mtd *mtd; - int i; - - for (i = 0; i < NTDA; i++) { - mtd = &sc->mtda[i]; - mtd->mtd_mbuf = 0; - } - - sc->mtd_hw = 0; - sc->mtd_prev = NTDA - 1; - sc->mtd_free = 0; - sc->mtd_tlinko = TXP_FRAGOFF + 1*TXP_FRAGSIZE + TXP_FPTRLO; - sc->mtd_pint = NTDA/2; - - NIC_PUT(sc, SNCR_UTDA, UPPER(sc->mtda[0].mtd_vtxp)); - NIC_PUT(sc, SNCR_CTDA, LOWER(sc->mtda[0].mtd_vtxp)); -} - -static void -initialise_rda(struct snc_softc *sc) -{ - int i; - u_int32_t vv_rda = 0; - u_int32_t v_rda = 0; - - /* link the RDA's together into a circular list */ - for (i = 0; i < (sc->sc_nrda - 1); i++) { - v_rda = sc->v_rda + (i * RXPKT_SIZE(sc)); - vv_rda = sc->v_rda + ((i+1) * RXPKT_SIZE(sc)); - SWO(sc, v_rda, RXPKT_RLINK, LOWER(vv_rda)); - SWO(sc, v_rda, RXPKT_INUSE, 1); - } - v_rda = sc->v_rda + ((sc->sc_nrda - 1) * RXPKT_SIZE(sc)); - SWO(sc, v_rda, RXPKT_RLINK, LOWER(sc->v_rda) | EOL); - SWO(sc, v_rda, RXPKT_INUSE, 1); - - /* mark end of receive descriptor list */ - sc->sc_rdamark = sc->sc_nrda - 1; - - sc->sc_rxmark = 0; - - NIC_PUT(sc, SNCR_URDA, UPPER(sc->v_rda)); - NIC_PUT(sc, SNCR_CRDA, LOWER(sc->v_rda)); - wbflush(); -} - -static void -initialise_rra(struct snc_softc *sc) -{ - int i; - u_int v; - int bitmode = sc->bitmode; - - if (bitmode) - NIC_PUT(sc, SNCR_EOBC, RBASIZE(sc) / 2 - 2); - else - NIC_PUT(sc, SNCR_EOBC, RBASIZE(sc) / 2 - 1); - - NIC_PUT(sc, SNCR_URRA, UPPER(sc->v_rra[0])); - NIC_PUT(sc, SNCR_RSA, LOWER(sc->v_rra[0])); - /* rea must point just past the end of the rra space */ - NIC_PUT(sc, SNCR_REA, LOWER(sc->v_rea)); - NIC_PUT(sc, SNCR_RRP, LOWER(sc->v_rra[0])); - NIC_PUT(sc, SNCR_RSC, 0); - - /* fill up SOME of the rra with buffers */ - for (i = 0; i < NRBA; i++) { - v = SONIC_GETDMA(sc->rbuf[i]); - SWO(sc, sc->v_rra[i], RXRSRC_PTRHI, UPPER(v)); - SWO(sc, sc->v_rra[i], RXRSRC_PTRLO, LOWER(v)); - SWO(sc, sc->v_rra[i], RXRSRC_WCHI, UPPER(PAGE_SIZE/2)); - SWO(sc, sc->v_rra[i], RXRSRC_WCLO, LOWER(PAGE_SIZE/2)); - } - sc->sc_rramark = NRBA; - NIC_PUT(sc, SNCR_RWP, LOWER(sc->v_rra[sc->sc_rramark])); - wbflush(); -} - -void -sncintr(void *arg) -{ - struct snc_softc *sc = (struct snc_softc *)arg; - int isr; - - if (sc->sc_enabled == 0) - return; - - SNC_LOCK(sc); - while ((isr = (NIC_GET(sc, SNCR_ISR) & ISR_ALL)) != 0) { - /* scrub the interrupts that we are going to service */ - NIC_PUT(sc, SNCR_ISR, isr); - wbflush(); - - if (isr & (ISR_BR | ISR_LCD | ISR_TC)) - device_printf(sc->sc_dev, - "unexpected interrupt status 0x%x\n", - isr); - - if (isr & (ISR_TXDN | ISR_TXER | ISR_PINT)) - sonictxint(sc); - - if (isr & ISR_PKTRX) - sonicrxint(sc); - - if (isr & (ISR_HBL | ISR_RDE | ISR_RBE | ISR_RBAE | ISR_RFO)) { - if (isr & ISR_HBL) - /* - * The repeater is not providing a heartbeat. - * In itself this isn't harmful, lots of the - * cheap repeater hubs don't supply a heartbeat. - * So ignore the lack of heartbeat. Its only - * if we can't detect a carrier that we have a - * problem. - */ - ; - if (isr & ISR_RDE) - device_printf(sc->sc_dev, - "receive descriptors exhausted\n"); - if (isr & ISR_RBE) - device_printf(sc->sc_dev, - "receive buffers exhausted\n"); - if (isr & ISR_RBAE) - device_printf(sc->sc_dev, - "receive buffer area exhausted\n"); - if (isr & ISR_RFO) - device_printf(sc->sc_dev, - "receive FIFO overrun\n"); - } - if (isr & (ISR_CRC | ISR_FAE | ISR_MP)) { -#ifdef notdef - if (isr & ISR_CRC) - sc->sc_crctally++; - if (isr & ISR_FAE) - sc->sc_faetally++; - if (isr & ISR_MP) - sc->sc_mptally++; -#endif - } - sncstart_locked(sc->sc_ifp); - } - SNC_UNLOCK(sc); - return; -} - -/* - * Transmit interrupt routine - */ -static void -sonictxint(struct snc_softc *sc) -{ - struct mtd *mtd; - u_int32_t txp; - unsigned short txp_status; - int mtd_hw; - struct ifnet *ifp = sc->sc_ifp; - - mtd_hw = sc->mtd_hw; - - if (mtd_hw == sc->mtd_free) - return; - - while (mtd_hw != sc->mtd_free) { - mtd = &sc->mtda[mtd_hw]; - - txp = mtd->mtd_vtxp; - - if (SRO(sc, txp, TXP_STATUS) == 0) { - break; /* it hasn't really gone yet */ - } - -#ifdef SNCDEBUG - if ((sncdebug & SNC_SHOWTXHDR) != 0) - { - struct ether_header eh; - - (*sc->sc_copyfrombuf)(sc, &eh, mtd->mtd_vbuf, sizeof(eh)); - device_printf(sc->sc_dev, - "xmit status=0x%x len=%d type=0x%x from %6D", - SRO(sc, txp, TXP_STATUS), - SRO(sc, txp, TXP_PKTSIZE), - htons(eh.ether_type), - eh.ether_shost, ":"); - printf(" (to %6D)\n", eh.ether_dhost, ":"); - } -#endif /* SNCDEBUG */ - - sc->sc_tx_timeout = 0; - ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; - - if (mtd->mtd_mbuf != 0) { - m_freem(mtd->mtd_mbuf); - mtd->mtd_mbuf = 0; - } - if (++mtd_hw == NTDA) mtd_hw = 0; - - txp_status = SRO(sc, txp, TXP_STATUS); - - if_inc_counter(ifp, IFCOUNTER_COLLISIONS, - (txp_status & TCR_EXC) ? 16 : - ((txp_status & TCR_NC) >> 12)); - - if ((txp_status & TCR_PTX) == 0) { - if_inc_counter(ifp, IFCOUNTER_OERRORS, 1); - device_printf(sc->sc_dev, "Tx packet status=0x%x\n", - txp_status); - - /* XXX - DG This looks bogus */ - if (mtd_hw != sc->mtd_free) { - printf("resubmitting remaining packets\n"); - mtd = &sc->mtda[mtd_hw]; - NIC_PUT(sc, SNCR_CTDA, LOWER(mtd->mtd_vtxp)); - NIC_PUT(sc, SNCR_CR, CR_TXP); - wbflush(); - break; - } - } - } - - sc->mtd_hw = mtd_hw; - return; -} - -/* - * Receive interrupt routine - */ -static void -sonicrxint(struct snc_softc *sc) -{ - u_int32_t rda; - int orra; - int len; - int rramark; - int rdamark; - u_int16_t rxpkt_ptr; - - rda = sc->v_rda + (sc->sc_rxmark * RXPKT_SIZE(sc)); - - while (SRO(sc, rda, RXPKT_INUSE) == 0) { - u_int status = SRO(sc, rda, RXPKT_STATUS); - - orra = RBASEQ(SRO(sc, rda, RXPKT_SEQNO)) & RRAMASK; - rxpkt_ptr = SRO(sc, rda, RXPKT_PTRLO); - /* - * Do not trunc ether_header length. - * Our sonic_read() and sonic_get() require it. - */ - len = SRO(sc, rda, RXPKT_BYTEC) - FCSSIZE; - if (status & RCR_PRX) { - /* XXX: Does PAGE_MASK require? */ - u_int32_t pkt = - sc->rbuf[orra & RBAMASK] + (rxpkt_ptr & PAGE_MASK); - if (sonic_read(sc, pkt, len)) - if_inc_counter(sc->sc_ifp, IFCOUNTER_IPACKETS, 1); - else - if_inc_counter(sc->sc_ifp, IFCOUNTER_IERRORS, 1); - } else - if_inc_counter(sc->sc_ifp, IFCOUNTER_IERRORS, 1); - - /* - * give receive buffer area back to chip. - * - * If this was the last packet in the RRA, give the RRA to - * the chip again. - * If sonic read didn't copy it out then we would have to - * wait !! - * (dont bother add it back in again straight away) - * - * Really, we're doing v_rra[rramark] = v_rra[orra] but - * we have to use the macros because SONIC might be in - * 16 or 32 bit mode. - */ - if (status & RCR_LPKT) { - u_int32_t tmp1, tmp2; - - rramark = sc->sc_rramark; - tmp1 = sc->v_rra[rramark]; - tmp2 = sc->v_rra[orra]; - SWO(sc, tmp1, RXRSRC_PTRLO, - SRO(sc, tmp2, RXRSRC_PTRLO)); - SWO(sc, tmp1, RXRSRC_PTRHI, - SRO(sc, tmp2, RXRSRC_PTRHI)); - SWO(sc, tmp1, RXRSRC_WCLO, - SRO(sc, tmp2, RXRSRC_WCLO)); - SWO(sc, tmp1, RXRSRC_WCHI, - SRO(sc, tmp2, RXRSRC_WCHI)); - - /* zap old rra for fun */ - SWO(sc, tmp2, RXRSRC_WCHI, 0); - SWO(sc, tmp2, RXRSRC_WCLO, 0); - - sc->sc_rramark = (++rramark) & RRAMASK; - NIC_PUT(sc, SNCR_RWP, LOWER(sc->v_rra[rramark])); - wbflush(); - } - - /* - * give receive descriptor back to chip simple - * list is circular - */ - rdamark = sc->sc_rdamark; - SWO(sc, rda, RXPKT_INUSE, 1); - SWO(sc, rda, RXPKT_RLINK, - SRO(sc, rda, RXPKT_RLINK) | EOL); - SWO(sc, (sc->v_rda + (rdamark * RXPKT_SIZE(sc))), RXPKT_RLINK, - SRO(sc, (sc->v_rda + (rdamark * RXPKT_SIZE(sc))), - RXPKT_RLINK) & ~EOL); - sc->sc_rdamark = sc->sc_rxmark; - - if (++sc->sc_rxmark >= sc->sc_nrda) - sc->sc_rxmark = 0; - rda = sc->v_rda + (sc->sc_rxmark * RXPKT_SIZE(sc)); - } -} - -/* - * sonic_read -- pull packet off interface and forward to - * appropriate protocol handler - */ -static int -sonic_read(struct snc_softc *sc, u_int32_t pkt, int len) -{ - struct ifnet *ifp = sc->sc_ifp; - struct ether_header *et; - struct mbuf *m; - - if (len <= sizeof(struct ether_header) || - len > ETHERMTU + sizeof(struct ether_header)) { - device_printf(sc->sc_dev, - "invalid packet length %d bytes\n", len); - return (0); - } - - /* Pull packet off interface. */ - m = sonic_get(sc, pkt, len); - if (m == 0) { - return (0); - } - - /* We assume that the header fit entirely in one mbuf. */ - et = mtod(m, struct ether_header *); - -#ifdef SNCDEBUG - if ((sncdebug & SNC_SHOWRXHDR) != 0) - { - device_printf(sc->sc_dev, "rcvd 0x%x len=%d type=0x%x from %6D", - pkt, len, htons(et->ether_type), - et->ether_shost, ":"); - printf(" (to %6D)\n", et->ether_dhost, ":"); - } -#endif /* SNCDEBUG */ - - /* Pass the packet up. */ - SNC_UNLOCK(sc); - (*ifp->if_input)(ifp, m); - SNC_LOCK(sc); - return (1); -} - - -/* - * munge the received packet into an mbuf chain - */ -static struct mbuf * -sonic_get(struct snc_softc *sc, u_int32_t pkt, int datalen) -{ - struct mbuf *m, *top, **mp; - int len; - /* - * Do not trunc ether_header length. - * Our sonic_read() and sonic_get() require it. - */ - - MGETHDR(m, M_NOWAIT, MT_DATA); - if (m == 0) - return (0); - m->m_pkthdr.rcvif = sc->sc_ifp; - m->m_pkthdr.len = datalen; - len = MHLEN; - top = 0; - mp = ⊤ - - while (datalen > 0) { - if (top) { - MGET(m, M_NOWAIT, MT_DATA); - if (m == 0) { - m_freem(top); - return (0); - } - len = MLEN; - } - if (datalen >= MINCLSIZE) { - if (!(MCLGET(m, M_NOWAIT))) { - if (top) m_freem(top); - return (0); - } - len = MCLBYTES; - } -#if 0 - /* XXX: Require? */ - if (!top) { - register int pad = - ALIGN(sizeof(struct ether_header)) - - sizeof(struct ether_header); - m->m_data += pad; - len -= pad; - } -#endif - m->m_len = len = min(datalen, len); - - (*sc->sc_copyfrombuf)(sc, mtod(m, caddr_t), pkt, len); - pkt += len; - datalen -= len; - *mp = m; - mp = &m->m_next; - } - - return (top); -} -/* - * Enable power on the interface. - */ -int -snc_enable(struct snc_softc *sc) -{ - -#ifdef SNCDEBUG - device_printf(sc->sc_dev, "snc_enable()\n"); -#endif /* SNCDEBUG */ - - if (sc->sc_enabled == 0 && sc->sc_enable != NULL) { - if ((*sc->sc_enable)(sc) != 0) { - device_printf(sc->sc_dev, "device enable failed\n"); - return (EIO); - } - } - - sc->sc_enabled = 1; - return (0); -} - -/* - * Disable power on the interface. - */ -void -snc_disable(struct snc_softc *sc) -{ - -#ifdef SNCDEBUG - device_printf(sc->sc_dev, "snc_disable()\n"); -#endif /* SNCDEBUG */ - - if (sc->sc_enabled != 0 && sc->sc_disable != NULL) { - (*sc->sc_disable)(sc); - sc->sc_enabled = 0; - } -} - - diff --git a/sys/dev/snc/dp83932reg.h b/sys/dev/snc/dp83932reg.h deleted file mode 100644 index 31ab550b83ca..000000000000 --- a/sys/dev/snc/dp83932reg.h +++ /dev/null @@ -1,271 +0,0 @@ -/* $FreeBSD$ */ -/* $NecBSD: dp83932reg.h,v 1.2 1999/02/12 05:50:13 kmatsuda Exp $ */ -/* $NetBSD: if_snreg.h,v 1.4 1997/06/15 20:20:12 scottr Exp $ */ - -/*- - * Copyright (c) 1991 Algorithmics Ltd (http://www.algor.co.uk) - * You may use, copy, and modify this program so long as you retain the - * copyright line. - */ - -/* - * if_snreg.h -- National Semiconductor DP8393X (SONIC) register defs - */ - -/* - * SONIC registers as seen by the processor - */ -#define SNCR_CR 0x00 /* Command */ -#define SNCR_DCR 0x01 /* Data Configuration */ -#define SNCR_RCR 0x02 /* Receive Control */ -#define SNCR_TCR 0x03 /* Transmit Control */ -#define SNCR_IMR 0x04 /* Interrupt Mask */ -#define SNCR_ISR 0x05 /* Interrupt Status */ -#define SNCR_UTDA 0x06 /* Upper Transmit Descriptor Address */ -#define SNCR_CTDA 0x07 /* Current Transmit Descriptor Address */ -#define SNCR_TPS 0x08 /* Transmit Packet Size */ -#define SNCR_TFC 0x09 /* Transmit Fragment Count */ -#define SNCR_TSA0 0x0a /* Transmit Start Address 0 */ -#define SNCR_TSA1 0x0b /* Transmit Start Address 1 */ -#define SNCR_TFS 0x0c /* Transmit Fragment Size */ -#define SNCR_URDA 0x0d /* Upper Receive Descriptor Address */ -#define SNCR_CRDA 0x0e /* Current Receive Descriptor Address */ -#define SNCR_CRBA0 0x0f /* Current Receive Buffer Address 0 */ -#define SNCR_CRBA1 0x10 /* Current Receive Buffer Address 1 */ -#define SNCR_RBWC0 0x11 /* Remaining Buffer Word Count 0 */ -#define SNCR_RBWC1 0x12 /* Remaining Buffer Word Count 1 */ -#define SNCR_EOBC 0x13 /* End Of Buffer Word Count */ -#define SNCR_URRA 0x14 /* Upper Receive Resource Address */ -#define SNCR_RSA 0x15 /* Resource Start Address */ -#define SNCR_REA 0x16 /* Resource End Address */ -#define SNCR_RRP 0x17 /* Resource Read Pointer */ -#define SNCR_RWP 0x18 /* Resource Write Pointer */ -#define SNCR_TRBA0 0x19 /* Temporary Receive Buffer Address 0 */ -#define SNCR_TRBA1 0x1a /* Temporary Receive Buffer Address 1 */ -#define SNCR_TBWC0 0x1b /* Temporary Buffer Word Count 0 */ -#define SNCR_TBWC1 0x1c /* Temporary Buffer Word Count 1 */ -#define SNCR_ADDR0 0x1d /* Address Generator 0 */ -#define SNCR_ADDR1 0x1e /* Address Generator 1 */ -#define SNCR_LLFA 0x1f /* Last Link Field Address */ -#define SNCR_TTDA 0x20 /* Temp Transmit Descriptor Address */ -#define SNCR_CEP 0x21 /* CAM Entry Pointer */ -#define SNCR_CAP2 0x22 /* CAM Address Port 2 */ -#define SNCR_CAP1 0x23 /* CAM Address Port 1 */ -#define SNCR_CAP0 0x24 /* CAM Address Port 0 */ -#define SNCR_CE 0x25 /* CAM Enable */ -#define SNCR_CDP 0x26 /* CAM Descriptor Pointer */ -#define SNCR_CDC 0x27 /* CAM Descriptor Count */ -#define SNCR_SR 0x28 /* Silicon Revision */ -#define SNCR_WT0 0x29 /* Watchdog Timer 0 */ -#define SNCR_WT1 0x2a /* Watchdog Timer 1 */ -#define SNCR_RSC 0x2b /* Receive Sequence Counter */ -#define SNCR_CRCT 0x2c /* CRC Error Tally */ -#define SNCR_FAET 0x2d /* FAE Tally */ -#define SNCR_MPT 0x2e /* Missed Packet Tally */ -#define SNCR_MDT 0x2f /* Maximum Deferral Timer */ -#define SNCR_RTC 0x30 /* Receive Test Control */ -#define SNCR_TTC 0x31 /* Transmit Test Control */ -#define SNCR_DTC 0x32 /* DMA Test Control */ -#define SNCR_CC0 0x33 /* CAM Comparison 0 */ -#define SNCR_CC1 0x34 /* CAM Comparison 1 */ -#define SNCR_CC2 0x35 /* CAM Comparison 2 */ -#define SNCR_CM 0x36 /* CAM Match */ -#define SNCR_RES1 0x37 /* reserved */ -#define SNCR_RES2 0x38 /* reserved */ -#define SNCR_RBC 0x39 /* Receiver Byte Count */ -#define SNCR_RES3 0x3a /* reserved */ -#define SNCR_TBO 0x3b /* Transmitter Backoff Counter */ -#define SNCR_TRC 0x3c /* Transmitter Random Counter */ -#define SNCR_TBM 0x3d /* Transmitter Backoff Mask */ -#define SNCR_RES4 0x3e /* Reserved */ -#define SNCR_DCR2 0x3f /* Data Configuration 2 (AVF) */ - -#define SNC_NREGS 0x40 - -/* - * Register Interpretations - */ - -/* - * The command register is used for issuing commands to the SONIC. - * With the exception of CR_RST, the bit is reset when the operation - * completes. - */ -#define CR_LCAM 0x0200 /* load CAM with descriptor at s_cdp */ -#define CR_RRRA 0x0100 /* read next RRA descriptor at s_rrp */ -#define CR_RST 0x0080 /* software reset */ -#define CR_ST 0x0020 /* start timer */ -#define CR_STP 0x0010 /* stop timer */ -#define CR_RXEN 0x0008 /* receiver enable */ -#define CR_RXDIS 0x0004 /* receiver disable */ -#define CR_TXP 0x0002 /* transmit packets */ -#define CR_HTX 0x0001 /* halt transmission */ - -/* - * The data configuration register establishes the SONIC's bus cycle - * operation. This register can only be accessed when the SONIC is in - * reset mode (s_cr.CR_RST is set.) - */ -#define DCR_EXBUS 0x8000 /* extended bus mode (AVF) */ -#define DCR_LBR 0x2000 /* latched bus retry */ -#define DCR_PO1 0x1000 /* programmable output 1 */ -#define DCR_PO0 0x0800 /* programmable output 0 */ -#define DCR_STERM 0x0400 /* synchronous termination */ -#define DCR_USR1 0x0200 /* reflects USR1 input pin */ -#define DCR_USR0 0x0100 /* reflects USR0 input pin */ -#define DCR_WC1 0x0080 /* wait state control 1 */ -#define DCR_WC0 0x0040 /* wait state control 0 */ -#define DCR_DW 0x0020 /* data width select */ -#define DCR_BMS 0x0010 /* DMA block mode select */ -#define DCR_RFT1 0x0008 /* receive FIFO threshold control 1 */ -#define DCR_RFT0 0x0004 /* receive FIFO threshold control 0 */ -#define DCR_TFT1 0x0002 /* transmit FIFO threshold control 1 */ -#define DCR_TFT0 0x0001 /* transmit FIFO threshold control 0 */ - -/* data configuration register aliases */ -#define DCR_SYNC DCR_STERM /* synchronous (memory cycle 2 clocks) */ -#define DCR_ASYNC 0 /* asynchronous (memory cycle 3 clocks) */ - -#define DCR_WAIT0 0 /* 0 wait states added */ -#define DCR_WAIT1 DCR_WC0 /* 1 wait state added */ -#define DCR_WAIT2 DCR_WC1 /* 2 wait states added */ -#define DCR_WAIT3 (DCR_WC1|DCR_WC0) /* 3 wait states added */ - -#define DCR_DW16 0 /* use 16-bit DMA accesses */ -#define DCR_DW32 DCR_DW /* use 32-bit DMA accesses */ - -#define DCR_DMAEF 0 /* DMA until TX/RX FIFO has emptied/filled */ -#define DCR_DMABLOCK DCR_BMS /* DMA until RX/TX threshold crossed */ - -#define DCR_RFT4 0 /* receive threshold 4 bytes */ -#define DCR_RFT8 DCR_RFT0 /* receive threshold 8 bytes */ -#define DCR_RFT16 DCR_RFT1 /* receive threshold 16 bytes */ -#define DCR_RFT24 (DCR_RFT1|DCR_RFT0) /* receive threshold 24 bytes */ - -#define DCR_TFT8 0 /* transmit threshold 8 bytes */ -#define DCR_TFT16 DCR_TFT0 /* transmit threshold 16 bytes */ -#define DCR_TFT24 DCR_TFT1 /* transmit threshold 24 bytes */ -#define DCR_TFT28 (DCR_TFT1|DCR_TFT0) /* transmit threshold 28 bytes */ - -/* - * The receive control register is used to filter incoming packets and - * provides status information on packets received. - * The contents of the register are copied into the RXpkt.status field - * when a packet is received. RCR_MC - RCR_PRX are then reset. - */ -#define RCR_ERR 0x8000 /* accept packets with CRC errors */ -#define RCR_RNT 0x4000 /* accept runt (length < 64) packets */ -#define RCR_BRD 0x2000 /* accept broadcast packets */ -#define RCR_PRO 0x1000 /* accept all physical address packets */ -#define RCR_AMC 0x0800 /* accept all multicast packets */ -#define RCR_LB1 0x0400 /* loopback control 1 */ -#define RCR_LB0 0x0200 /* loopback control 0 */ -#define RCR_MC 0x0100 /* multicast packet received */ -#define RCR_BC 0x0080 /* broadcast packet received */ -#define RCR_LPKT 0x0040 /* last packet in RBA (RBWC < EOBC) */ -#define RCR_CRS 0x0020 /* carrier sense activity */ -#define RCR_COL 0x0010 /* collision activity */ -#define RCR_CRC 0x0008 /* CRC error */ -#define RCR_FAE 0x0004 /* frame alignment error */ -#define RCR_LBK 0x0002 /* loopback packet received */ -#define RCR_PRX 0x0001 /* packet received without errors */ - -/* receiver control register aliases */ -/* the loopback control bits provide the following options */ -#define RCR_LBNONE 0 /* no loopback - normal operation */ -#define RCR_LBMAC RCR_LB0 /* MAC loopback */ -#define RCR_LBENDEC RCR_LB1 /* ENDEC loopback */ -#define RCR_LBTRANS (RCR_LB1|RCR_LB0) /* transceiver loopback */ - -/* - * The transmit control register controls the SONIC's transmit operations. - * TCR_PINT - TCR_EXDIS are loaded from the TXpkt.config field at the - * start of transmission. TCR_EXD-TCR_PTX are cleared at the beginning - * of transmission and updated when the transmission is completed. - */ -#define TCR_PINT 0x8000 /* interrupt when transmission starts */ -#define TCR_POWC 0x4000 /* program out of window collision timer */ -#define TCR_CRCI 0x2000 /* transmit packet without 4 byte FCS */ -#define TCR_EXDIS 0x1000 /* disable excessive deferral timer */ -#define TCR_EXD 0x0400 /* excessive deferrals occurred (>3.2ms) */ -#define TCR_DEF 0x0200 /* deferred transmissions occurred */ -#define TCR_NCRS 0x0100 /* carrier not present during transmission */ -#define TCR_CRSL 0x0080 /* carrier lost during transmission */ -#define TCR_EXC 0x0040 /* excessive collisions (>16) detected */ -#define TCR_OWC 0x0020 /* out of window (bad) collision occurred */ -#define TCR_PMB 0x0008 /* packet monitored bad - the tansmitted - * packet had a bad source address or CRC */ -#define TCR_FU 0x0004 /* FIFO underrun (memory access failed) */ -#define TCR_BCM 0x0002 /* byte count mismatch (TXpkt.pkt_size - * != sum(TXpkt.frag_size) */ -#define TCR_PTX 0x0001 /* packet transmitted without errors */ -#define TCR_NC 0xf000 /* after transmission, # of colls */ - -/* transmit control register aliases */ -#define TCR_OWCSFD 0 /* start after start of frame delimiter */ -#define TCR_OWCPRE TCR_POWC /* start after first bit of preamble */ - - -/* - * The interrupt mask register masks the interrupts that - * are generated from the interrupt status register. - * All reserved bits should be written with 0. - */ -#define IMR_BREN 0x4000 /* bus retry occurred enable */ -#define IMR_HBLEN 0x2000 /* heartbeat lost enable */ -#define IMR_LCDEN 0x1000 /* load CAM done interrupt enable */ -#define IMR_PINTEN 0x0800 /* programmable interrupt enable */ -#define IMR_PRXEN 0x0400 /* packet received enable */ -#define IMR_PTXEN 0x0200 /* packet transmitted enable */ -#define IMR_TXEREN 0x0100 /* transmit error enable */ -#define IMR_TCEN 0x0080 /* timer complete enable */ -#define IMR_RDEEN 0x0040 /* receive descriptors exhausted enable */ -#define IMR_RBEEN 0x0020 /* receive buffers exhausted enable */ -#define IMR_RBAEEN 0x0010 /* receive buffer area exceeded enable */ -#define IMR_CRCEN 0x0008 /* CRC tally counter rollover enable */ -#define IMR_FAEEN 0x0004 /* FAE tally counter rollover enable */ -#define IMR_MPEN 0x0002 /* MP tally counter rollover enable */ -#define IMR_RFOEN 0x0001 /* receive FIFO overrun enable */ - - -/* - * The interrupt status register indicates the source of an interrupt when - * the INT pin goes active. The interrupt is acknowledged by writing - * the appropriate bit(s) in this register. - */ -#define ISR_ALL 0x7fff /* all interrupts */ -#define ISR_BR 0x4000 /* bus retry occurred */ -#define ISR_HBL 0x2000 /* CD heartbeat lost */ -#define ISR_LCD 0x1000 /* load CAM command has completed */ -#define ISR_PINT 0x0800 /* programmed interrupt from TXpkt.config */ -#define ISR_PKTRX 0x0400 /* packet received */ -#define ISR_TXDN 0x0200 /* no remaining packets to be transmitted */ -#define ISR_TXER 0x0100 /* packet transmission caused error */ -#define ISR_TC 0x0080 /* timer complete */ -#define ISR_RDE 0x0040 /* receive descriptors exhausted */ -#define ISR_RBE 0x0020 /* receive buffers exhausted */ -#define ISR_RBAE 0x0010 /* receive buffer area exceeded */ -#define ISR_CRC 0x0008 /* CRC tally counter rollover */ -#define ISR_FAE 0x0004 /* FAE tally counter rollover */ -#define ISR_MP 0x0002 /* MP tally counter rollover */ -#define ISR_RFO 0x0001 /* receive FIFO overrun */ - -/* - * The second data configuration register allows additional user defined - * pins to be controlled. These bits are only available if s_dcr.DCR_EXBUS - * is set. - */ -#define DCR2_EXPO3 0x8000 /* EXUSR3 output */ -#define DCR2_EXPO2 0x4000 /* EXUSR2 output */ -#define DCR2_EXPO1 0x2000 /* EXUSR1 output */ -#define DCR2_EXPO0 0x1000 /* EXUSR0 output */ -#define DCR2_HD 0x0800 /* heart beat disable (83934/83936) */ -#define DCR2_JD 0x0200 /* TPI jabber timer disable (83934/83936) */ -#define DCR2_AUTO 0x0100 /* AUI/TPI auto selection (83934/83936) */ -#define DCR2_XWRAP 0x0040 /* TPI transceiver loopback (83934/83936) */ -#define DCR2_FD 0x0020 /* full duplex (83936) */ -#define DCR2_PHL 0x0010 /* extend HOLD signal by 1/2 clock */ -#define DCR2_LRDY 0x0008 /* set latched ready mode */ -#define DCR2_PCM 0x0004 /* packet compress on match */ -#define DCR2_PCNM 0x0002 /* packet compress on mismatch */ -#define DCR2_RJM 0x0001 /* reject on match */ diff --git a/sys/dev/snc/dp83932subr.c b/sys/dev/snc/dp83932subr.c deleted file mode 100644 index a34c554aa5e1..000000000000 --- a/sys/dev/snc/dp83932subr.c +++ /dev/null @@ -1,839 +0,0 @@ -/* $NecBSD: dp83932subr.c,v 1.5.6.2 1999/10/09 05:47:23 kmatsuda Exp $ */ -/* $NetBSD$ */ - -/*- - * Copyright (c) 1997, 1998, 1999 - * Kouichi Matsuda. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by Kouichi Matsuda for - * NetBSD/pc98. - * 4. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); -/* - * Routines of NEC PC-9801-83, 84, 103, 104, PC-9801N-25 and PC-9801N-J02, J02R - * Ethernet interface for NetBSD/pc98, ported by Kouichi Matsuda. - * - * These cards use National Semiconductor DP83934AVQB as Ethernet Controller - * and National Semiconductor NS46C46 as (64 * 16 bits) Microwire Serial EEPROM. - */ - -/* - * Modified for FreeBSD(98) 4.0 from NetBSD/pc98 1.4.2 by Motomichi Matsuzaki. - */ - -#include <sys/param.h> -#include <sys/systm.h> -#include <sys/protosw.h> -#include <sys/socket.h> - -#include <net/ethernet.h> -#include <net/if.h> -#include <net/if_arp.h> -#include <net/if_media.h> - -#include <sys/bus.h> -#include <machine/bus.h> - -#include <dev/snc/dp83932reg.h> -#include <dev/snc/dp83932var.h> -#include <dev/snc/if_sncreg.h> -#include <dev/snc/dp83932subr.h> - -static __inline u_int16_t snc_nec16_select_bank - (struct snc_softc *, u_int32_t, u_int32_t); - -/* - * Interface exists: make available by filling in network interface - * record. System will initialize the interface when it is ready - * to accept packets. - */ -int -sncsetup(struct snc_softc *sc, u_int8_t *lladdr) -{ - u_int32_t p, pp; - int i; - int offset; - - /* - * Put the pup in reset mode (sncinit() will fix it later), - * stop the timer, disable all interrupts and clear any interrupts. - */ - NIC_PUT(sc, SNCR_CR, CR_STP); - wbflush(); - NIC_PUT(sc, SNCR_CR, CR_RST); - wbflush(); - NIC_PUT(sc, SNCR_IMR, 0); - wbflush(); - NIC_PUT(sc, SNCR_ISR, ISR_ALL); - wbflush(); - - /* - * because the SONIC is basically 16bit device it 'concatenates' - * a higher buffer address to a 16 bit offset--this will cause wrap - * around problems near the end of 64k !! - */ - p = pp = 0; - - for (i = 0; i < NRRA; i++) { - sc->v_rra[i] = SONIC_GETDMA(p); - p += RXRSRC_SIZE(sc); - } - sc->v_rea = SONIC_GETDMA(p); - - p = SOALIGN(sc, p); - - sc->v_cda = SONIC_GETDMA(p); - p += CDA_SIZE(sc); - - p = SOALIGN(sc, p); - - for (i = 0; i < NTDA; i++) { - struct mtd *mtdp = &sc->mtda[i]; - mtdp->mtd_vtxp = SONIC_GETDMA(p); - p += TXP_SIZE(sc); - } - - p = SOALIGN(sc, p); - - if ((p - pp) > PAGE_SIZE) { - device_printf (sc->sc_dev, "sizeof RRA (%ld) + CDA (%ld) +" - "TDA (%ld) > PAGE_SIZE (%d). Punt!\n", - (u_long)sc->v_cda - (u_long)sc->v_rra[0], - (u_long)sc->mtda[0].mtd_vtxp - (u_long)sc->v_cda, - (u_long)p - (u_long)sc->mtda[0].mtd_vtxp, - PAGE_SIZE); - return(1); - } - - p = pp + PAGE_SIZE; - pp = p; - - sc->sc_nrda = PAGE_SIZE / RXPKT_SIZE(sc); - sc->v_rda = SONIC_GETDMA(p); - - p = pp + PAGE_SIZE; - - for (i = 0; i < NRBA; i++) { - sc->rbuf[i] = p; - p += PAGE_SIZE; - } - - pp = p; - offset = TXBSIZE; - for (i = 0; i < NTDA; i++) { - struct mtd *mtdp = &sc->mtda[i]; - - mtdp->mtd_vbuf = SONIC_GETDMA(p); - offset += TXBSIZE; - if (offset < PAGE_SIZE) { - p += TXBSIZE; - } else { - p = pp + PAGE_SIZE; - pp = p; - offset = TXBSIZE; - } - } - - return (0); -} - -/* - * miscellaneous NEC/SONIC detect functions. - */ - -/* - * check if a specified irq is acceptable. - */ -u_int8_t -snc_nec16_validate_irq(int irq) -{ - const u_int8_t encoded_irq[16] = { - -1, -1, -1, 0, -1, 1, 2, -1, -1, 3, 4, -1, 5, 6, -1, -1 - }; - - return encoded_irq[irq]; -} - -/* - * specify irq to board. - */ -int -snc_nec16_register_irq(struct snc_softc *sc, int irq) -{ - bus_space_tag_t iot = sc->sc_iot; - bus_space_handle_t ioh = sc->sc_ioh; - u_int8_t encoded_irq; - - encoded_irq = snc_nec16_validate_irq(irq); - if (encoded_irq == (u_int8_t) -1) { - printf("snc_nec16_register_irq: unsupported irq (%d)\n", irq); - return 0; - } - - /* select SNECR_IRQSEL register */ - bus_space_write_1(iot, ioh, SNEC_ADDR, SNECR_IRQSEL); - /* write encoded irq value */ - bus_space_write_1(iot, ioh, SNEC_CTRLB, encoded_irq); - - return 1; -} - -/* - * check if a specified memory base address is acceptable. - */ -int -snc_nec16_validate_mem(int maddr) -{ - - /* Check on Normal mode with max range, only */ - if ((maddr & ~0x1E000) != 0xC0000) { - printf("snc_nec16_validate_mem: " - "unsupported window base (0x%x)\n", maddr); - return 0; - } - - return 1; -} - -/* - * specify memory base address to board and map to first bank. - */ -int -snc_nec16_register_mem(struct snc_softc *sc, int maddr) -{ - bus_space_tag_t iot = sc->sc_iot; - bus_space_handle_t ioh = sc->sc_ioh; - - if (snc_nec16_validate_mem(maddr) == 0) - return 0; - - /* select SNECR_MEMSEL register */ - bus_space_write_1(iot, ioh, SNEC_ADDR, SNECR_MEMSEL); - /* write encoded memory base select value */ - bus_space_write_1(iot, ioh, SNEC_CTRLB, SNECR_MEMSEL_PHYS2EN(maddr)); - - /* - * set current bank to 0 (bottom) and map - */ - /* select SNECR_MEMBS register */ - bus_space_write_1(iot, ioh, SNEC_ADDR, SNECR_MEMBS); - /* select new bank */ - bus_space_write_1(iot, ioh, SNEC_CTRLB, - SNECR_MEMBS_B2EB(0) | SNECR_MEMBS_BSEN); - /* set current bank to 0 */ - sc->curbank = 0; - - return 1; -} - -int -snc_nec16_check_memory(bus_space_tag_t iot, bus_space_handle_t ioh, - bus_space_tag_t memt, bus_space_handle_t memh) -{ - u_int16_t val; - int i, j; - - val = 0; - for (i = 0; i < SNEC_NBANK; i++) { - /* select new bank */ - bus_space_write_1(iot, ioh, SNEC_ADDR, SNECR_MEMBS); - bus_space_write_1(iot, ioh, SNEC_CTRLB, - SNECR_MEMBS_B2EB(i) | SNECR_MEMBS_BSEN); - - /* write test pattern */ - for (j = 0; j < SNEC_NMEMS / 2; j++) { - bus_space_write_2(memt, memh, j * 2, val + j); - } - val += 0x1000; - } - - val = 0; - for (i = 0; i < SNEC_NBANK; i++) { - /* select new bank */ - bus_space_write_1(iot, ioh, SNEC_ADDR, SNECR_MEMBS); - bus_space_write_1(iot, ioh, SNEC_CTRLB, - SNECR_MEMBS_B2EB(i) | SNECR_MEMBS_BSEN); - - /* read test pattern */ - for (j = 0; j < SNEC_NMEMS / 2; j++) { - if (bus_space_read_2(memt, memh, j * 2) != val + j) - break; - } - - if (j < SNEC_NMEMS / 2) { - printf("snc_nec16_check_memory: " - "memory check failed at 0x%04x%04x" - "val 0x%04x != expected 0x%04x\n", i, j, - bus_space_read_2(memt, memh, j * 2), - val + j); - return 0; - } - val += 0x1000; - } - - /* zero clear mem */ - for (i = 0; i < SNEC_NBANK; i++) { - /* select new bank */ - bus_space_write_1(iot, ioh, SNEC_ADDR, SNECR_MEMBS); - bus_space_write_1(iot, ioh, SNEC_CTRLB, - SNECR_MEMBS_B2EB(i) | SNECR_MEMBS_BSEN); - - bus_space_set_region_4(memt, memh, 0, 0, SNEC_NMEMS >> 2); - } - - /* again read test if these are 0 */ - for (i = 0; i < SNEC_NBANK; i++) { - /* select new bank */ - bus_space_write_1(iot, ioh, SNEC_ADDR, SNECR_MEMBS); - bus_space_write_1(iot, ioh, SNEC_CTRLB, - SNECR_MEMBS_B2EB(i) | SNECR_MEMBS_BSEN); - - /* check if cleared */ - for (j = 0; j < SNEC_NMEMS; j += 2) { - if (bus_space_read_2(memt, memh, j) != 0) - break; - } - - if (j != SNEC_NMEMS) { - printf("snc_nec16_check_memory: " - "memory zero clear failed at 0x%04x%04x\n", i, j); - return 0; - } - } - - return 1; -} - -int -snc_nec16_detectsubr(bus_space_tag_t iot, bus_space_handle_t ioh, - bus_space_tag_t memt, bus_space_handle_t memh, int irq, int maddr, - u_int8_t type) -{ - u_int16_t cr; - u_int8_t ident; - int rv = 0; - - if (snc_nec16_validate_irq(irq) == (u_int8_t) -1) - return 0; - /* XXX: maddr already checked */ - if (snc_nec16_validate_mem(maddr) == 0) - return 0; - - bus_space_write_1(iot, ioh, SNEC_ADDR, SNECR_IDENT); - ident = bus_space_read_1(iot, ioh, SNEC_CTRLB); - if (ident == 0xff || ident == 0x00) { - /* not found */ - return 0; - } - - switch (type) { - case SNEC_TYPE_LEGACY: - rv = (ident == SNECR_IDENT_LEGACY_CBUS); - break; - case SNEC_TYPE_PNP: - rv = ((ident == SNECR_IDENT_PNP_CBUS) || - (ident == SNECR_IDENT_PNP_PCMCIABUS)); - break; - default: - break; - } - - if (rv == 0) { - printf("snc_nec16_detectsubr: parent bus mismatch\n"); - return 0; - } - - /* select SONIC register SNCR_CR */ - bus_space_write_1(iot, ioh, SNEC_ADDR, SNCR_CR); - bus_space_write_2(iot, ioh, SNEC_CTRL, CR_RXDIS | CR_STP | CR_RST); - DELAY(400); - - cr = bus_space_read_2(iot, ioh, SNEC_CTRL); - if (cr != (CR_RXDIS | CR_STP | CR_RST)) { -#ifdef DIAGNOSTIC - printf("snc_nec16_detectsubr: card reset failed, cr = 0x%04x\n", - cr); -#endif - return 0; - } - - if (snc_nec16_check_memory(iot, ioh, memt, memh) == 0) - return 0; - - return 1; -} - -/* XXX */ -#define SNC_VENDOR_NEC 0x00004c -#define SNC_NEC_SERIES_LEGACY_CBUS 0xa5 -#define SNC_NEC_SERIES_PNP_PCMCIA 0xd5 -#define SNC_NEC_SERIES_PNP_PCMCIA2 0x6d /* XXX */ -#define SNC_NEC_SERIES_PNP_CBUS 0x0d -#define SNC_NEC_SERIES_PNP_CBUS2 0x3d - -u_int8_t * -snc_nec16_detect_type(u_int8_t *myea) -{ - u_int32_t vendor = (myea[0] << 16) | (myea[1] << 8) | myea[2]; - u_int8_t series = myea[3]; - u_int8_t type = myea[4] & 0x80; - u_int8_t *typestr; - - switch (vendor) { - case SNC_VENDOR_NEC: - switch (series) { - case SNC_NEC_SERIES_LEGACY_CBUS: - if (type) - typestr = "NEC PC-9801-84"; - else - typestr = "NEC PC-9801-83"; - break; - case SNC_NEC_SERIES_PNP_CBUS: - case SNC_NEC_SERIES_PNP_CBUS2: - if (type) - typestr = "NEC PC-9801-104"; - else - typestr = "NEC PC-9801-103"; - break; - case SNC_NEC_SERIES_PNP_PCMCIA: - case SNC_NEC_SERIES_PNP_PCMCIA2: - /* XXX: right ? */ - if (type) - typestr = "NEC PC-9801N-J02R"; - else - typestr = "NEC PC-9801N-J02"; - break; - default: - typestr = "NEC unknown (PC-9801N-25?)"; - break; - } - break; - default: - typestr = "unknown (3rd vendor?)"; - break; - } - - return typestr; -} - -int -snc_nec16_get_enaddr(bus_space_tag_t iot, bus_space_handle_t ioh, - u_int8_t *myea) -{ - u_int8_t eeprom[SNEC_EEPROM_SIZE]; - u_int8_t rom_sum, sum = 0x00; - int i; - - snc_nec16_read_eeprom(iot, ioh, eeprom); - - for (i = SNEC_EEPROM_KEY0; i < SNEC_EEPROM_CKSUM; i++) { - sum = sum ^ eeprom[i]; - } - - rom_sum = eeprom[SNEC_EEPROM_CKSUM]; - - if (sum != rom_sum) { - printf("snc_nec16_get_enaddr: " - "checksum mismatch; calculated %02x != read %02x", - sum, rom_sum); - return 0; - } - - for (i = 0; i < ETHER_ADDR_LEN; i++) - myea[i] = eeprom[SNEC_EEPROM_SA0 + i]; - - return 1; -} - -/* - * read from NEC/SONIC NIC register. - */ -u_int16_t -snc_nec16_nic_get(struct snc_softc *sc, u_int8_t reg) -{ - u_int16_t val; - - /* select SONIC register */ - bus_space_write_1(sc->sc_iot, sc->sc_ioh, SNEC_ADDR, reg); - val = bus_space_read_2(sc->sc_iot, sc->sc_ioh, SNEC_CTRL); - - return val; -} - -/* - * write to NEC/SONIC NIC register. - */ -void -snc_nec16_nic_put(struct snc_softc *sc, u_int8_t reg, u_int16_t val) -{ - - /* select SONIC register */ - bus_space_write_1(sc->sc_iot, sc->sc_ioh, SNEC_ADDR, reg); - bus_space_write_2(sc->sc_iot, sc->sc_ioh, SNEC_CTRL, val); -} - - -/* - * select memory bank and map - * where exists specified (internal buffer memory) offset. - */ -static __inline u_int16_t -snc_nec16_select_bank(struct snc_softc *sc, u_int32_t base, u_int32_t offset) -{ - bus_space_tag_t iot = sc->sc_iot; - bus_space_handle_t ioh = sc->sc_ioh; - u_int8_t bank; - u_int16_t noffset; - - /* bitmode is fixed to 16 bit. */ - bank = (base + offset * 2) >> 13; - noffset = (base + offset * 2) & (SNEC_NMEMS - 1); - -#ifdef SNCDEBUG - if (noffset % 2) { - device_printf(sc->sc_dev, "noffset is odd (0x%04x)\n", - noffset); - } -#endif /* SNCDEBUG */ - - if (sc->curbank != bank) { - /* select SNECR_MEMBS register */ - bus_space_write_1(iot, ioh, SNEC_ADDR, SNECR_MEMBS); - /* select new bank */ - bus_space_write_1(iot, ioh, SNEC_CTRLB, - SNECR_MEMBS_B2EB(bank) | SNECR_MEMBS_BSEN); - /* update current bank */ - sc->curbank = bank; - } - - return noffset; -} - -/* - * write to SONIC descriptors. - */ -void -snc_nec16_writetodesc(struct snc_softc *sc, u_int32_t base, u_int32_t offset, - u_int16_t val) -{ - bus_space_tag_t memt = sc->sc_memt; - bus_space_handle_t memh = sc->sc_memh; - u_int16_t noffset; - - noffset = snc_nec16_select_bank(sc, base, offset); - - bus_space_write_2(memt, memh, noffset, val); -} - -/* - * read from SONIC descriptors. - */ -u_int16_t -snc_nec16_readfromdesc(struct snc_softc *sc, u_int32_t base, u_int32_t offset) -{ - bus_space_tag_t memt = sc->sc_memt; - bus_space_handle_t memh = sc->sc_memh; - u_int16_t noffset; - - noffset = snc_nec16_select_bank(sc, base, offset); - - return bus_space_read_2(memt, memh, noffset); -} - -/* - * read from SONIC data buffer. - */ -void -snc_nec16_copyfrombuf(struct snc_softc *sc, void *dst, u_int32_t offset, - size_t size) -{ - bus_space_tag_t memt = sc->sc_memt; - bus_space_handle_t memh = sc->sc_memh; - u_int16_t noffset; - u_int8_t* bptr = dst; - - noffset = snc_nec16_select_bank(sc, offset, 0); - - /* XXX: should check if offset + size < 0x2000. */ - - bus_space_barrier(memt, memh, noffset, size, - BUS_SPACE_BARRIER_READ); - - if (size > 3) { - if (noffset & 3) { - size_t asize = 4 - (noffset & 3); - - bus_space_read_region_1(memt, memh, noffset, - bptr, asize); - bptr += asize; - noffset += asize; - size -= asize; - } - bus_space_read_region_4(memt, memh, noffset, - (u_int32_t *) bptr, size >> 2); - bptr += size & ~3; - noffset += size & ~3; - size &= 3; - } - if (size) - bus_space_read_region_1(memt, memh, noffset, bptr, size); -} - -/* - * write to SONIC data buffer. - */ -void -snc_nec16_copytobuf(struct snc_softc *sc, void *src, u_int32_t offset, - size_t size) -{ - bus_space_tag_t memt = sc->sc_memt; - bus_space_handle_t memh = sc->sc_memh; - u_int16_t noffset, onoffset; - size_t osize = size; - u_int8_t* bptr = src; - - noffset = snc_nec16_select_bank(sc, offset, 0); - onoffset = noffset; - - /* XXX: should check if offset + size < 0x2000. */ - - if (size > 3) { - if (noffset & 3) { - size_t asize = 4 - (noffset & 3); - - bus_space_write_region_1(memt, memh, noffset, - bptr, asize); - bptr += asize; - noffset += asize; - size -= asize; - } - bus_space_write_region_4(memt, memh, noffset, - (u_int32_t *)bptr, size >> 2); - bptr += size & ~3; - noffset += size & ~3; - size -= size & ~3; - } - if (size) - bus_space_write_region_1(memt, memh, noffset, bptr, size); - - bus_space_barrier(memt, memh, onoffset, osize, - BUS_SPACE_BARRIER_WRITE); -} - -/* - * write (fill) 0 to SONIC data buffer. - */ -void -snc_nec16_zerobuf(struct snc_softc *sc, u_int32_t offset, size_t size) -{ - bus_space_tag_t memt = sc->sc_memt; - bus_space_handle_t memh = sc->sc_memh; - u_int16_t noffset, onoffset; - size_t osize = size; - - noffset = snc_nec16_select_bank(sc, offset, 0); - onoffset = noffset; - - /* XXX: should check if offset + size < 0x2000. */ - - if (size > 3) { - if (noffset & 3) { - size_t asize = 4 - (noffset & 3); - - bus_space_set_region_1(memt, memh, noffset, 0, asize); - noffset += asize; - size -= asize; - } - bus_space_set_region_4(memt, memh, noffset, 0, size >> 2); - noffset += size & ~3; - size -= size & ~3; - } - if (size) - bus_space_set_region_1(memt, memh, noffset, 0, size); - - bus_space_barrier(memt, memh, onoffset, osize, - BUS_SPACE_BARRIER_WRITE); -} - - -/* - * Routines to read bytes sequentially from EEPROM through NEC PC-9801-83, - * 84, 103, 104, PC-9801N-25 and PC-9801N-J02, J02R for NetBSD/pc98. - * Ported by Kouichi Matsuda. - * - * This algorism is generic to read data sequentially from 4-Wire - * Microwire Serial EEPROM. - */ - -#define SNEC_EEP_DELAY 1000 - -void -snc_nec16_read_eeprom(bus_space_tag_t iot, bus_space_handle_t ioh, - u_int8_t *data) -{ - u_int8_t n, val, bit; - - /* Read bytes from EEPROM; two bytes per an iteration. */ - for (n = 0; n < SNEC_EEPROM_SIZE / 2; n++) { - /* select SNECR_EEP */ - bus_space_write_1(iot, ioh, SNEC_ADDR, SNECR_EEP); - - bus_space_write_1(iot, ioh, SNEC_CTRLB, 0x00); - DELAY(SNEC_EEP_DELAY); - - /* Start EEPROM access. */ - bus_space_write_1(iot, ioh, SNEC_CTRLB, SNECR_EEP_CS); - DELAY(SNEC_EEP_DELAY); - - bus_space_write_1(iot, ioh, SNEC_CTRLB, - SNECR_EEP_CS | SNECR_EEP_SK); - DELAY(SNEC_EEP_DELAY); - - bus_space_write_1(iot, ioh, SNEC_CTRLB, - SNECR_EEP_CS | SNECR_EEP_DI); - DELAY(SNEC_EEP_DELAY); - - bus_space_write_1(iot, ioh, SNEC_CTRLB, - SNECR_EEP_CS | SNECR_EEP_SK | SNECR_EEP_DI); - DELAY(SNEC_EEP_DELAY); - - bus_space_write_1(iot, ioh, SNEC_CTRLB, - SNECR_EEP_CS | SNECR_EEP_DI); - DELAY(SNEC_EEP_DELAY); - - bus_space_write_1(iot, ioh, SNEC_CTRLB, - SNECR_EEP_CS | SNECR_EEP_SK | SNECR_EEP_DI); - DELAY(SNEC_EEP_DELAY); - - bus_space_write_1(iot, ioh, SNEC_CTRLB, SNECR_EEP_CS); - DELAY(SNEC_EEP_DELAY); - - bus_space_write_1(iot, ioh, SNEC_CTRLB, - SNECR_EEP_CS | SNECR_EEP_SK); - DELAY(SNEC_EEP_DELAY); - - /* Pass the iteration count to the chip. */ - for (bit = 0x20; bit != 0x00; bit >>= 1) { - bus_space_write_1(iot, ioh, SNEC_CTRLB, SNECR_EEP_CS | - ((n & bit) ? SNECR_EEP_DI : 0x00)); - DELAY(SNEC_EEP_DELAY); - - bus_space_write_1(iot, ioh, SNEC_CTRLB, - SNECR_EEP_CS | SNECR_EEP_SK | - ((n & bit) ? SNECR_EEP_DI : 0x00)); - DELAY(SNEC_EEP_DELAY); - } - - bus_space_write_1(iot, ioh, SNEC_CTRLB, SNECR_EEP_CS); - (void) bus_space_read_1(iot, ioh, SNEC_CTRLB); /* ACK */ - DELAY(SNEC_EEP_DELAY); - - /* Read a byte. */ - val = 0; - for (bit = 0x80; bit != 0x00; bit >>= 1) { - bus_space_write_1(iot, ioh, SNEC_CTRLB, - SNECR_EEP_CS | SNECR_EEP_SK); - DELAY(SNEC_EEP_DELAY); - - bus_space_write_1(iot, ioh, SNEC_CTRLB, SNECR_EEP_CS); - - if (bus_space_read_1(iot, ioh, SNEC_CTRLB) & SNECR_EEP_DO) - val |= bit; - } - *data++ = val; - - /* Read one more byte. */ - val = 0; - for (bit = 0x80; bit != 0x00; bit >>= 1) { - bus_space_write_1(iot, ioh, SNEC_CTRLB, - SNECR_EEP_CS | SNECR_EEP_SK); - DELAY(SNEC_EEP_DELAY); - - bus_space_write_1(iot, ioh, SNEC_CTRLB, SNECR_EEP_CS); - - if (bus_space_read_1(iot, ioh, SNEC_CTRLB) & SNECR_EEP_DO) - val |= bit; - } - *data++ = val; - - bus_space_write_1(iot, ioh, SNEC_CTRLB, 0x00); - DELAY(SNEC_EEP_DELAY); - } - -#ifdef SNCDEBUG - /* Report what we got. */ - data -= SNEC_EEPROM_SIZE; - log(LOG_INFO, "%s: EEPROM:" - " %02x%02x%02x%02x %02x%02x%02x%02x -" - " %02x%02x%02x%02x %02x%02x%02x%02x -" - " %02x%02x%02x%02x %02x%02x%02x%02x -" - " %02x%02x%02x%02x %02x%02x%02x%02x\n", - "snc_nec16_read_eeprom", - data[ 0], data[ 1], data[ 2], data[ 3], - data[ 4], data[ 5], data[ 6], data[ 7], - data[ 8], data[ 9], data[10], data[11], - data[12], data[13], data[14], data[15], - data[16], data[17], data[18], data[19], - data[20], data[21], data[22], data[23], - data[24], data[25], data[26], data[27], - data[28], data[29], data[30], data[31]); -#endif -} - -#ifdef SNCDEBUG -void -snc_nec16_dump_reg(bus_space_tag_t iot, bus_space_handle_t ioh) -{ - u_int8_t n; - u_int16_t val; - - printf("SONIC registers (word):"); - for (n = 0; n < SNC_NREGS; n++) { - /* select required SONIC register */ - bus_space_write_1(iot, ioh, SNEC_ADDR, n); - DELAY(10); - val = bus_space_read_2(iot, ioh, SNEC_CTRL); - if ((n % 0x10) == 0) - printf("\n%04x ", val); - else - printf("%04x ", val); - } - printf("\n"); - - printf("NEC/SONIC registers (byte):\n"); - for (n = SNECR_MEMBS; n <= SNECR_IDENT; n += 2) { - /* select required SONIC register */ - bus_space_write_1(iot, ioh, SNEC_ADDR, n); - DELAY(10); - val = (u_int16_t) bus_space_read_1(iot, ioh, SNEC_CTRLB); - printf("%04x ", val); - } - printf("\n"); -} - -#endif /* SNCDEBUG */ diff --git a/sys/dev/snc/dp83932subr.h b/sys/dev/snc/dp83932subr.h deleted file mode 100644 index f5df4f97970f..000000000000 --- a/sys/dev/snc/dp83932subr.h +++ /dev/null @@ -1,78 +0,0 @@ -/* $FreeBSD$ */ -/* $NecBSD: dp83932subr.h,v 1.5 1999/02/02 00:47:25 kmatsuda Exp $ */ -/* $NetBSD$ */ - -/*- - * Copyright (c) 1997, 1998, 1999 - * Kouichi Matsuda. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by Kouichi Matsuda for - * NetBSD/pc98. - * 4. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -/* - * Routines of NEC PC-9801-83, 84, 103, 104, PC-9801N-25 and PC-9801N-J02, J02R - * Ethernet interface for NetBSD/pc98, ported by Kouichi Matsuda. - * - * These cards use National Semiconductor DP83934AVQB as Ethernet Controller - * and National Semiconductor NS46C46 as (64 * 16 bits) Microwire Serial EEPROM. - */ - -int sncsetup(struct snc_softc *, u_int8_t *); - -u_int8_t snc_nec16_validate_irq(int); -int snc_nec16_register_irq(struct snc_softc *, int); -int snc_nec16_validate_mem(int); -int snc_nec16_register_mem(struct snc_softc *, int); - -u_int16_t snc_nec16_nic_get(struct snc_softc *, u_int8_t); -void snc_nec16_nic_put(struct snc_softc *, u_int8_t, u_int16_t); - - -void snc_nec16_writetodesc - (struct snc_softc *, u_int32_t, u_int32_t, u_int16_t); -u_int16_t snc_nec16_readfromdesc - (struct snc_softc *, u_int32_t, u_int32_t); - -void snc_nec16_copyfrombuf(struct snc_softc *, void *, u_int32_t, size_t); -void snc_nec16_copytobuf(struct snc_softc *, void *, u_int32_t, size_t); -void snc_nec16_zerobuf(struct snc_softc *, u_int32_t, size_t); - -int snc_nec16_detectsubr - (bus_space_tag_t, bus_space_handle_t, bus_space_tag_t, - bus_space_handle_t, int, int, u_int8_t); -int snc_nec16_check_memory - (bus_space_tag_t, bus_space_handle_t, bus_space_tag_t, - bus_space_handle_t); - -int snc_nec16_get_enaddr - (bus_space_tag_t, bus_space_handle_t, u_int8_t *); -u_int8_t *snc_nec16_detect_type(u_int8_t *); -void snc_nec16_read_eeprom - (bus_space_tag_t, bus_space_handle_t, u_int8_t *); - -#ifdef SNCDEBUG -void snc_nec16_dump_reg(bus_space_tag_t, bus_space_handle_t); -#endif /* SNDEBUG */ diff --git a/sys/dev/snc/dp83932var.h b/sys/dev/snc/dp83932var.h deleted file mode 100644 index 6ee51085b9b0..000000000000 --- a/sys/dev/snc/dp83932var.h +++ /dev/null @@ -1,286 +0,0 @@ -/* $FreeBSD$ */ -/* $NecBSD: dp83932var.h,v 1.3 1999/01/24 01:39:51 kmatsuda Exp $ */ -/* $NetBSD: if_snvar.h,v 1.12 1998/05/01 03:42:47 scottr Exp $ */ - -/*- - * [NetBSD for NEC PC-98 series] - * Copyright (c) 1997, 1998, 1999 - * Kouichi Matsuda. All rights reserved. - * - * Copyright (c) 1991 Algorithmics Ltd (http://www.algor.co.uk) - * You may use, copy, and modify this program so long as you retain the - * copyright line. - */ - -/* - * if_snvar.h -- National Semiconductor DP8393X (SONIC) NetBSD/mac68k vars - */ -/* - * Modified for NetBSD/pc98 1.2.1 from NetBSD/mac68k 1.2D by Kouichi Matsuda. - * Make adapted for NEC PC-9801-83, 84, PC-9801-103, 104, PC-9801N-25 and - * PC-9801N-J02, J02R, which uses National Semiconductor DP83934AVQB as - * Ethernet Controller and National Semiconductor NS46C46 as - * (64 * 16 bits) Microwire Serial EEPROM. - */ - -/* - * Vendor types - */ - -/* - * SONIC buffers need to be aligned 16 or 32 bit aligned. - * These macros calculate and verify alignment. - */ -#define ROUNDUP(p, N) (((int) p + N - 1) & ~(N - 1)) - -#define SOALIGN(m, array) (m ? (ROUNDUP(array, 4)) : (ROUNDUP(array, 2))) - -#define LOWER(x) ((unsigned)(x) & 0xffff) -#define UPPER(x) ((unsigned)(x) >> 16) - -/* - * Memory access macros. Since we handle SONIC in 16 bit mode (PB5X0) - * and 32 bit mode (everything else) using a single GENERIC kernel - * binary, all structures have to be accessed using macros which can - * adjust the offsets appropriately. - */ -/* m is not sc->bitmode, we treat m as sc. */ -#define SWO(m, a, o, x) (*(m)->sc_writetodesc)((m), (a), (o), (x)) -#define SRO(m, a, o) (*(m)->sc_readfromdesc)((m), (a), (o)) - -/* - * Register access macros. We use bus_space_* to talk to the Sonic - * registers. A mapping table is used in case a particular configuration - * hooked the regs up at non-word offsets. - */ -#define NIC_GET(sc, reg) (*(sc)->sc_nic_get)(sc, reg) -#define NIC_PUT(sc, reg, val) (*(sc)->sc_nic_put)(sc, reg, val) - -#define SONIC_GETDMA(p) (p) - -/* pc98 does not have any write buffers to flush... */ -#define wbflush() - -/* - * buffer sizes in 32 bit mode - * 1 TXpkt is 4 hdr words + (3 * FRAGMAX) + 1 link word == 23 words == 92 bytes - * - * 1 RxPkt is 7 words == 28 bytes - * 1 Rda is 4 words == 16 bytes - * - * The CDA is 17 words == 68 bytes - * - * total space in page 0 = NTDA * 92 + NRRA * 16 + NRDA * 28 + 68 - */ - -#define NRBA 16 /* # receive buffers < NRRA */ -#define RBAMASK (NRBA-1) -#define NTDA 16 /* # transmit descriptors */ -#define NRRA 64 /* # receive resource descriptors */ -#define RRAMASK (NRRA-1) /* the reason why NRRA must be power of two */ - -#define FCSSIZE 4 /* size of FCS appended to packets */ - -/* - * maximum receive packet size plus 2 byte pad to make each - * one aligned. 4 byte slop (required for eobc) - */ -#define RBASIZE(sc) (sizeof(struct ether_header) + ETHERMTU + FCSSIZE + \ - ((sc)->bitmode ? 6 : 2)) - -/* - * transmit buffer area - */ -#define TXBSIZE 1536 /* 6*2^8 -- the same size as the 8390 TXBUF */ - -#define SN_NPAGES 2 + NRBA + (NTDA/2) - -typedef struct mtd { - u_int32_t mtd_vtxp; - u_int32_t mtd_vbuf; - struct mbuf *mtd_mbuf; -} mtd_t; - -/* - * The snc_softc for PC-98 if_snc. - */ -typedef struct snc_softc { - struct ifnet * sc_ifp; - - device_t sc_dev; - - struct resource * ioport; - int ioport_rid; - struct resource * iomem; - int iomem_rid; - struct resource * irq; - int irq_rid; - void * irq_handle; - - bus_space_tag_t sc_iot; /* bus identifier for io */ - bus_space_tag_t sc_memt; /* bus identifier for mem */ - bus_space_handle_t sc_ioh; /* io handle */ - bus_space_handle_t sc_memh; /* bus memory handle */ - - int bitmode; /* 32 bit mode == 1, 16 == 0 */ - - u_int16_t sncr_dcr; /* DCR for this instance */ - u_int16_t sncr_dcr2; /* DCR2 for this instance */ - - int sc_rramark; /* index into v_rra of wp */ - u_int32_t v_rra[NRRA]; /* DMA addresses of v_rra */ - u_int32_t v_rea; /* ptr to the end of the rra space */ - - int sc_rxmark; /* current hw pos in rda ring */ - int sc_rdamark; /* current sw pos in rda ring */ - int sc_nrda; /* total number of RDAs */ - u_int32_t v_rda; - - u_int32_t rbuf[NRBA]; - - struct mtd mtda[NTDA]; - int mtd_hw; /* idx of first mtd given to hw */ - int mtd_prev; /* idx of last mtd given to hardware */ - int mtd_free; /* next free mtd to use */ - int mtd_tlinko; /* - * offset of tlink of last txp given - * to SONIC. Need to clear EOL on - * this word to add a desc. - */ - int mtd_pint; /* Counter to set TXP_PINT */ - - u_int32_t v_cda; - - u_int8_t curbank; /* current window bank */ - - struct ifmedia sc_media; /* supported media information */ - - /* - * NIC register access functions: - */ - u_int16_t (*sc_nic_get) - (struct snc_softc *, u_int8_t); - void (*sc_nic_put) - (struct snc_softc *, u_int8_t, u_int16_t); - - /* - * Memory functions: - * - * copy to/from descriptor - * copy to/from buffer - * zero bytes in buffer - */ - void (*sc_writetodesc) - (struct snc_softc *, u_int32_t, u_int32_t, u_int16_t); - u_int16_t (*sc_readfromdesc) - (struct snc_softc *, u_int32_t, u_int32_t); - void (*sc_copytobuf) - (struct snc_softc *, void *, u_int32_t, size_t); - void (*sc_copyfrombuf) - (struct snc_softc *, void *, u_int32_t, size_t); - void (*sc_zerobuf) - (struct snc_softc *, u_int32_t, size_t); - - /* - * Machine-dependent functions: - * - * hardware reset hook - may be NULL - * hardware init hook - may be NULL - * media change hook - may be NULL - */ - void (*sc_hwreset)(struct snc_softc *); - void (*sc_hwinit)(struct snc_softc *); - int (*sc_mediachange)(struct snc_softc *); - void (*sc_mediastatus)(struct snc_softc *, struct ifmediareq *); - - int sc_enabled; /* boolean; power enabled on interface */ - - int (*sc_enable)(struct snc_softc *); - void (*sc_disable)(struct snc_softc *); - - void *sc_sh; /* shutdownhook cookie */ - int gone; - struct mtx sc_lock; - struct callout sc_timer; - int sc_tx_timeout; -} snc_softc_t; - -#define SNC_LOCK(sc) mtx_lock(&(sc)->sc_lock) -#define SNC_UNLOCK(sc) mtx_unlock(&(sc)->sc_lock) -#define SNC_ASSERT_LOCKED(sc) mtx_assert(&(sc)->sc_lock, MA_OWNED) - -/* - * Accessing SONIC data structures and registers as 32 bit values - * makes code endianness independent. The SONIC is however always in - * bigendian mode so it is necessary to ensure that data structures shared - * between the CPU and the SONIC are always in bigendian order. - */ - -/* - * Receive Resource Descriptor - * This structure describes the buffers into which packets - * will be received. Note that more than one packet may be - * packed into a single buffer if constraints permit. - */ -#define RXRSRC_PTRLO 0 /* buffer address LO */ -#define RXRSRC_PTRHI 1 /* buffer address HI */ -#define RXRSRC_WCLO 2 /* buffer size (16bit words) LO */ -#define RXRSRC_WCHI 3 /* buffer size (16bit words) HI */ - -#define RXRSRC_SIZE(sc) (sc->bitmode ? (4 * 4) : (4 * 2)) - -/* - * Receive Descriptor - * This structure holds information about packets received. - */ -#define RXPKT_STATUS 0 -#define RXPKT_BYTEC 1 -#define RXPKT_PTRLO 2 -#define RXPKT_PTRHI 3 -#define RXPKT_SEQNO 4 -#define RXPKT_RLINK 5 -#define RXPKT_INUSE 6 -#define RXPKT_SIZE(sc) (sc->bitmode ? (7 * 4) : (7 * 2)) - -#define RBASEQ(x) (((x)>>8)&0xff) -#define PSNSEQ(x) ((x) & 0xff) - -/* - * Transmit Descriptor - * This structure holds information about packets to be transmitted. - */ -#define FRAGMAX 8 /* maximum number of fragments in a packet */ - -#define TXP_STATUS 0 /* + transmitted packet status */ -#define TXP_CONFIG 1 /* transmission configuration */ -#define TXP_PKTSIZE 2 /* entire packet size in bytes */ -#define TXP_FRAGCNT 3 /* # fragments in packet */ - -#define TXP_FRAGOFF 4 /* offset to first fragment */ -#define TXP_FRAGSIZE 3 /* size of each fragment desc */ -#define TXP_FPTRLO 0 /* ptr to packet fragment LO */ -#define TXP_FPTRHI 1 /* ptr to packet fragment HI */ -#define TXP_FSIZE 2 /* fragment size */ - -#define TXP_WORDS (TXP_FRAGOFF + (FRAGMAX*TXP_FRAGSIZE) + 1) /* 1 for tlink */ -#define TXP_SIZE(sc) ((sc->bitmode) ? (TXP_WORDS*4) : (TXP_WORDS*2)) - -#define EOL 0x0001 /* end of list marker for link fields */ - -/* - * CDA, the CAM descriptor area. The SONIC has a 16 entry CAM to - * match incoming addresses against. It is programmed via DMA - * from a memory region. - */ -#define MAXCAM 16 /* number of user entries in CAM */ -#define CDA_CAMDESC 4 /* # words i na descriptor */ -#define CDA_CAMEP 0 /* CAM Address Port 0 xx-xx-xx-xx-YY-YY */ -#define CDA_CAMAP0 1 /* CAM Address Port 1 xx-xx-YY-YY-xx-xx */ -#define CDA_CAMAP1 2 /* CAM Address Port 2 YY-YY-xx-xx-xx-xx */ -#define CDA_CAMAP2 3 -#define CDA_ENABLE 64 /* mask enabling CAM entries */ -#define CDA_SIZE(sc) ((4*16 + 1) * ((sc->bitmode) ? 4 : 2)) - -int sncconfig(struct snc_softc *, int *, int, int, u_int8_t *); -void sncintr(void *); -void sncshutdown(void *); diff --git a/sys/dev/snc/if_snc.c b/sys/dev/snc/if_snc.c deleted file mode 100644 index 99f458354a7d..000000000000 --- a/sys/dev/snc/if_snc.c +++ /dev/null @@ -1,255 +0,0 @@ -/*- - * Copyright (c) 1995, David Greenman - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice unmodified, this list of conditions, and the following - * disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -/* - * National Semiconductor DP8393X SONIC Driver - * - * This is the bus independent attachment on FreeBSD 4.x - * written by Motomichi Matsuzaki <mzaki@e-mail.ne.jp> - */ - -#include <sys/param.h> -#include <sys/socket.h> - -#include <sys/bus.h> -#include <machine/bus.h> -#include <sys/rman.h> -#include <machine/resource.h> - -#include <net/ethernet.h> -#include <net/if.h> -#include <net/if_arp.h> -#include <net/if_media.h> -#include <net/if_var.h> - -#include <dev/snc/dp83932reg.h> -#include <dev/snc/dp83932var.h> -#include <dev/snc/dp83932subr.h> -#include <dev/snc/if_sncreg.h> -#include <dev/snc/if_sncvar.h> - -/* devclass for "snc" */ -devclass_t snc_devclass; - -/**************************************************************** - Resource management functions - ****************************************************************/ - -/* - * Allocate a port resource with the given resource id. - */ -int -snc_alloc_port(device_t dev, int rid) -{ - struct snc_softc *sc = device_get_softc(dev); - struct resource *res; - - res = bus_alloc_resource_anywhere(dev, SYS_RES_IOPORT, &rid, - SNEC_NREGS, RF_ACTIVE); - if (res) { - sc->ioport = res; - sc->ioport_rid = rid; - sc->sc_iot = rman_get_bustag(res); - sc->sc_ioh = rman_get_bushandle(res); - return (0); - } else { - device_printf(dev, "can't assign port\n"); - return (ENOENT); - } -} - -/* - * Allocate a memory resource with the given resource id. - */ -int -snc_alloc_memory(device_t dev, int rid) -{ - struct snc_softc *sc = device_get_softc(dev); - struct resource *res; - - res = bus_alloc_resource_anywhere(dev, SYS_RES_MEMORY, &rid, - SNEC_NMEMS, RF_ACTIVE); - if (res) { - sc->iomem = res; - sc->iomem_rid = rid; - sc->sc_memt = rman_get_bustag(res); - sc->sc_memh = rman_get_bushandle(res); - return (0); - } else { - device_printf(dev, "can't assign memory\n"); - return (ENOENT); - } -} - -/* - * Allocate an irq resource with the given resource id. - */ -int -snc_alloc_irq(device_t dev, int rid, int flags) -{ - struct snc_softc *sc = device_get_softc(dev); - struct resource *res; - - res = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid, RF_ACTIVE | flags); - if (res) { - sc->irq = res; - sc->irq_rid = rid; - return (0); - } else { - device_printf(dev, "can't assign irq\n"); - return (ENOENT); - } -} - -/* - * Release all resources - */ -void -snc_release_resources(device_t dev) -{ - struct snc_softc *sc = device_get_softc(dev); - - if (sc->ioport) { - bus_release_resource(dev, SYS_RES_IOPORT, - sc->ioport_rid, sc->ioport); - sc->ioport = 0; - } - if (sc->iomem) { - bus_release_resource(dev, SYS_RES_MEMORY, - sc->iomem_rid, sc->iomem); - sc->iomem = 0; - } - if (sc->irq) { - bus_release_resource(dev, SYS_RES_IRQ, - sc->irq_rid, sc->irq); - sc->irq = 0; - } - if (sc->sc_ifp) { - if_free(sc->sc_ifp); - sc->sc_ifp = 0; - } -} - -/**************************************************************** - Probe routine - ****************************************************************/ - -int -snc_probe(device_t dev, int type) -{ - struct snc_softc *sc = device_get_softc(dev); - - return snc_nec16_detectsubr(sc->sc_iot, sc->sc_ioh, - sc->sc_memt, sc->sc_memh, - rman_get_start(sc->irq), - rman_get_start(sc->iomem), - type); -} - -/**************************************************************** - Attach routine - ****************************************************************/ - -int -snc_attach(device_t dev) -{ - struct snc_softc *sc = device_get_softc(dev); - u_int8_t myea[ETHER_ADDR_LEN]; - int error; - - if (snc_nec16_register_irq(sc, rman_get_start(sc->irq)) == 0 || - snc_nec16_register_mem(sc, rman_get_start(sc->iomem)) == 0) { - snc_release_resources(dev); - return(ENOENT); - } - - snc_nec16_get_enaddr(sc->sc_iot, sc->sc_ioh, myea); - device_printf(dev, "%s Ethernet\n", snc_nec16_detect_type(myea)); - - sc->sc_dev = dev; - - sc->sncr_dcr = DCR_SYNC | DCR_WAIT0 | - DCR_DMABLOCK | DCR_RFT16 | DCR_TFT28; - sc->sncr_dcr2 = 0; /* XXX */ - sc->bitmode = 0; /* 16 bit card */ - - sc->sc_nic_put = snc_nec16_nic_put; - sc->sc_nic_get = snc_nec16_nic_get; - sc->sc_writetodesc = snc_nec16_writetodesc; - sc->sc_readfromdesc = snc_nec16_readfromdesc; - sc->sc_copytobuf = snc_nec16_copytobuf; - sc->sc_copyfrombuf = snc_nec16_copyfrombuf; - sc->sc_zerobuf = snc_nec16_zerobuf; - - /* sncsetup returns 1 if something fails */ - if (sncsetup(sc, myea)) { - snc_release_resources(dev); - return(ENOENT); - } - - mtx_init(&sc->sc_lock, device_get_nameunit(dev), MTX_NETWORK_LOCK, - MTX_DEF); - callout_init_mtx(&sc->sc_timer, &sc->sc_lock, 0); - error = sncconfig(sc, NULL, 0, 0, myea); - if (error) { - snc_release_resources(dev); - mtx_destroy(&sc->sc_lock); - return (error); - } - - error = bus_setup_intr(dev, sc->irq, INTR_TYPE_NET | INTR_MPSAFE, - NULL, sncintr, sc, &sc->irq_handle); - if (error) { - printf("snc_isa_attach: bus_setup_intr() failed\n"); - ether_ifdetach(sc->sc_ifp); - snc_release_resources(dev); - mtx_destroy(&sc->sc_lock); - return (error); - } - - return 0; -} - -/**************************************************************** - Shutdown routine - ****************************************************************/ - -int -snc_shutdown(device_t dev) -{ - struct snc_softc *sc = device_get_softc(dev); - - SNC_LOCK(sc); - sncshutdown(sc); - SNC_UNLOCK(sc); - - return (0); -} diff --git a/sys/dev/snc/if_snc_cbus.c b/sys/dev/snc/if_snc_cbus.c deleted file mode 100644 index 484b677967a3..000000000000 --- a/sys/dev/snc/if_snc_cbus.c +++ /dev/null @@ -1,211 +0,0 @@ -/*- - * Copyright (c) 1995, David Greenman - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice unmodified, this list of conditions, and the following - * disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -/* - * National Semiconductor DP8393X SONIC Driver - * - * This is the C-bus specific attachment on FreeBSD - * written by Motomichi Matsuzaki <mzaki@e-mail.ne.jp> - */ - -#include <sys/param.h> -#include <sys/systm.h> -#include <sys/socket.h> -#include <sys/kernel.h> - -#include <sys/module.h> -#include <sys/bus.h> -#include <machine/bus.h> -#include <machine/resource.h> - -#include <net/if.h> -#include <net/if_arp.h> -#include <net/if_media.h> - -#include <isa/isavar.h> -#include <sys/malloc.h> /* as dependency for isa/isa_common.h */ -#include <isa/isa_common.h> /* for snc_isapnp_reconfig() */ - -#include <dev/snc/dp83932var.h> -#include <dev/snc/if_sncreg.h> -#include <dev/snc/if_sncvar.h> - -static void snc_isapnp_reconfig (device_t); -static int snc_isa_probe (device_t); -static int snc_isa_attach (device_t); - -static struct isa_pnp_id snc_ids[] = { - { 0x6180a3b8, NULL }, /* NEC8061 NEC PC-9801-104 */ - { 0, NULL } -}; - -static void -snc_isapnp_reconfig(device_t dev) -{ - struct isa_device *idev = DEVTOISA(dev); - struct isa_config config; - rman_res_t start, count; - int rid; - - bzero(&config, sizeof(config)); - - for (rid = 0; rid < ISA_NMEM; rid++) { - if (bus_get_resource(dev, SYS_RES_MEMORY, rid, &start, &count)) - break; - config.ic_mem[rid].ir_start = start; - config.ic_mem[rid].ir_end = start; - config.ic_mem[rid].ir_size = count; - } - config.ic_nmem = rid; - for (rid = 0; rid < ISA_NPORT; rid++) { - if (bus_get_resource(dev, SYS_RES_IOPORT, rid, &start, &count)) - break; - config.ic_port[rid].ir_start = start; - config.ic_port[rid].ir_end = start; - config.ic_port[rid].ir_size = count; - } - config.ic_nport = rid; - for (rid = 0; rid < ISA_NIRQ; rid++) { - if (bus_get_resource(dev, SYS_RES_IRQ, rid, &start, &count)) - break; - config.ic_irqmask[rid] = 1 << start; - } - config.ic_nirq = rid; - for (rid = 0; rid < ISA_NDRQ; rid++) { - if (bus_get_resource(dev, SYS_RES_DRQ, rid, &start, &count)) - break; - config.ic_drqmask[rid] = 1 << start; - } - config.ic_ndrq = rid; - - idev->id_config_cb(idev->id_config_arg, &config, 1); -} - -static int -snc_isa_probe(device_t dev) -{ - struct snc_softc *sc = device_get_softc(dev); - int type; - int error = 0; - - bzero(sc, sizeof(struct snc_softc)); - - /* Check isapnp ids */ - error = ISA_PNP_PROBE(device_get_parent(dev), dev, snc_ids); - - /* If the card had a PnP ID that didn't match any we know about */ - if (error == ENXIO) { - return(error); - } - - switch (error) { - case 0: /* Matched PnP */ - type = SNEC_TYPE_PNP; - break; - - case ENOENT: /* Legacy ISA */ - type = SNEC_TYPE_LEGACY; - break; - - default: /* If we had some other problem. */ - return(error); - } - - if (type == SNEC_TYPE_PNP && isa_get_portsize(dev) == 0) { - int port; - int rid = 0; - struct resource *res = NULL; - - for (port = 0x0888; port <= 0x3888; port += 0x1000) { - bus_set_resource(dev, SYS_RES_IOPORT, rid, - port, SNEC_NREGS); - res = bus_alloc_resource_anywhere(dev, SYS_RES_IOPORT, - &rid, SNEC_NREGS, - 0 /* !RF_ACTIVE */); - if (res) break; - } - - printf("snc_isa_probe: broken PnP resource, "); - if (res) { - printf("use port 0x%x\n", port); - bus_release_resource(dev, SYS_RES_IOPORT, rid, res); - snc_isapnp_reconfig(dev); - } else { - printf("and can't find port\n"); - } - } - - error = snc_alloc_port(dev, 0); - error = max(error, snc_alloc_memory(dev, 0)); - error = max(error, snc_alloc_irq(dev, 0, 0)); - - if (!error && !snc_probe(dev, type)) - error = ENOENT; - - snc_release_resources(dev); - return (error); -} - -static int -snc_isa_attach(device_t dev) -{ - struct snc_softc *sc = device_get_softc(dev); - - bzero(sc, sizeof(struct snc_softc)); - - snc_alloc_port(dev, 0); - snc_alloc_memory(dev, 0); - snc_alloc_irq(dev, 0, 0); - - /* This interface is always enabled. */ - sc->sc_enabled = 1; - - return snc_attach(dev); -} - -static device_method_t snc_isa_methods[] = { - /* Device interface */ - DEVMETHOD(device_probe, snc_isa_probe), - DEVMETHOD(device_attach, snc_isa_attach), - DEVMETHOD(device_shutdown, snc_shutdown), - - { 0, 0 } -}; - -static driver_t snc_isa_driver = { - "snc", - snc_isa_methods, - sizeof(struct snc_softc) -}; - -DRIVER_MODULE(snc, isa, snc_isa_driver, snc_devclass, 0, 0); -MODULE_DEPEND(snc, isa, 1, 1, 1); -MODULE_DEPEND(snc, ether, 1, 1, 1); diff --git a/sys/dev/snc/if_snc_pccard.c b/sys/dev/snc/if_snc_pccard.c deleted file mode 100644 index 7f975be19163..000000000000 --- a/sys/dev/snc/if_snc_pccard.c +++ /dev/null @@ -1,164 +0,0 @@ -/*- - * Copyright (c) 1995, David Greenman - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice unmodified, this list of conditions, and the following - * disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -/* - * National Semiconductor DP8393X SONIC Driver - * - * This is the PC Card attachment on FreeBSD - * written by Motomichi Matsuzaki <mzaki@e-mail.ne.jp> and - * Hiroshi Yamashita <bluemoon@msj.biglobe.ne.jp> - */ - -#include <sys/param.h> -#include <sys/systm.h> -#include <sys/socket.h> -#include <sys/kernel.h> -#include <sys/lock.h> -#include <sys/mutex.h> - -#include <sys/module.h> -#include <sys/bus.h> -#include <machine/bus.h> - -#include <net/ethernet.h> -#include <net/if.h> -#include <net/if_arp.h> -#include <net/if_media.h> - -#include <dev/snc/dp83932var.h> -#include <dev/snc/if_sncvar.h> -#include <dev/snc/if_sncreg.h> - -#include <dev/pccard/pccardvar.h> -#include <dev/pccard/pccard_cis.h> -#include "pccarddevs.h" - -static const struct pccard_product snc_pccard_products[] = { - PCMCIA_CARD(NEC, PC9801N_J02), - PCMCIA_CARD(NEC, PC9801N_J02R), - { NULL } -}; - -/* - * PC Card (PCMCIA) specific code. - */ -static int snc_pccard_probe(device_t); -static int snc_pccard_attach(device_t); -static int snc_pccard_detach(device_t); - - -static device_method_t snc_pccard_methods[] = { - /* Device interface */ - DEVMETHOD(device_probe, snc_pccard_probe), - DEVMETHOD(device_attach, snc_pccard_attach), - DEVMETHOD(device_detach, snc_pccard_detach), - - { 0, 0 } -}; - -static driver_t snc_pccard_driver = { - "snc", - snc_pccard_methods, - sizeof(struct snc_softc) -}; - -DRIVER_MODULE(snc, pccard, snc_pccard_driver, snc_devclass, 0, 0); -MODULE_DEPEND(snc, ether, 1, 1, 1); -PCCARD_PNP_INFO(snc_pccard_products); - -/* - * snc_pccard_detach - detach this instance from the device. - */ -static int -snc_pccard_detach(device_t dev) -{ - struct snc_softc *sc = device_get_softc(dev); - struct ifnet *ifp = sc->sc_ifp; - - if (sc->gone) { - device_printf(dev, "already unloaded\n"); - return (0); - } - SNC_LOCK(sc); - sncshutdown(sc); - SNC_UNLOCK(sc); - callout_drain(&sc->sc_timer); - ether_ifdetach(ifp); - sc->gone = 1; - bus_teardown_intr(dev, sc->irq, sc->irq_handle); - snc_release_resources(dev); - mtx_destroy(&sc->sc_lock); - return (0); -} - -/* - * Probe the pccard. - */ -static int -snc_pccard_probe(device_t dev) -{ - const struct pccard_product *pp; - - if ((pp = pccard_product_lookup(dev, snc_pccard_products, - sizeof(snc_pccard_products[0]), NULL)) == NULL) - return (EIO); - if (pp->pp_name != NULL) - device_set_desc(dev, pp->pp_name); - return (0); -} - -static int -snc_pccard_attach(device_t dev) -{ - struct snc_softc *sc = device_get_softc(dev); - int error; - - /* - * Not sure that this belongs here or in snc_pccard_attach - */ - if ((error = snc_alloc_port(dev, 0)) != 0) - goto err; - if ((error = snc_alloc_memory(dev, 0)) != 0) - goto err; - if ((error = snc_alloc_irq(dev, 0, 0)) != 0) - goto err; - if ((error = snc_probe(dev, SNEC_TYPE_PNP)) != 0) - goto err; - /* This interface is always enabled. */ - sc->sc_enabled = 1; - /* pccard_get_ether(dev, ether_addr); */ - if ((error = snc_attach(dev)) != 0) - goto err; - return 0; -err:; - snc_release_resources(dev); - return error; -} diff --git a/sys/dev/snc/if_sncreg.h b/sys/dev/snc/if_sncreg.h deleted file mode 100644 index 5973881e8904..000000000000 --- a/sys/dev/snc/if_sncreg.h +++ /dev/null @@ -1,140 +0,0 @@ -/* $FreeBSD$ */ -/* $NecBSD: if_snreg.h,v 1.3 1999/01/24 01:39:52 kmatsuda Exp $ */ -/* $NetBSD$ */ - -/*- - * Copyright (c) 1997, 1998, 1999 - * Kouichi Matsuda. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by Kouichi Matsuda for - * NetBSD/pc98. - * 4. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -/* - * Modified for NetBSD/pc98 1.2.1 from NetBSD/mac68k 1.2D by Kouichi Matsuda. - * Make adapted for NEC PC-9801-83, 84, PC-9801-103, 104, PC-9801N-25 and - * PC-9801N-J02R, which uses National Semiconductor DP83934AVQB as - * Ethernet Controller and National Semiconductor NS46C46 as (64 * 16 bits) - * Microwire Serial EEPROM. - */ - -/* - * XXX: Should not be HERE. (Should be shared with...) - */ - -/* - * NEC/SONIC port mappings, offset from iobase. - */ -#define SNEC_CTRL 0 /* SONIC control port (word) */ -#define SNEC_CTRLB 1 /* NEC/SONIC control port (byte) */ -#define SNEC_RSVD0 2 /* not used */ -#define SNEC_ADDR 3 /* SONIC, NEC/SONIC register address set port */ -#define SNEC_RSVD1 4 /* not used */ -#define SNEC_RSVD2 5 /* not used */ - -#define SNEC_NREGS 6 - -/* bank memory size */ -#define SNEC_NMEMS (PAGE_SIZE * 2) -/* how many bank */ -#define SNEC_NBANK 0x10 -/* internal buffer size */ -#define SNEC_NBUF (SNEC_NMEMS * SNEC_NBANK) - - -/* - * NEC/SONIC specific internal registers. - */ - -/* - * Memory Bank Select Register (MEMBS) - */ -#define SNECR_MEMBS 0x80 -#define SNECR_MEMBS_BSEN 0x01 /* enable memory bank select */ -#define SNECR_MEMBS_EBNMSK 0x1c /* encoded bank select number */ -/* Translate bank number to encoded bank select number. */ -#define SNECR_MEMBS_B2EB(bank) (bank << 2) -#define SNECR_MEMBS_PCMCIABUS 0x80 /* bus type identification */ - -/* - * Memory Base Address Select Register (MEMSEL) - */ -#define SNECR_MEMSEL 0x82 -/* Translate base phys address to encoded select number. */ -#define SNECR_MEMSEL_PHYS2EN(maddr) ((maddr >> 13) & 0x0f) - -/* - * Encoded Irq Select Register (IRQSEL) - */ -#define SNECR_IRQSEL 0x84 - -/* - * EEPROM Access Register (EEP) - */ -#define SNECR_EEP 0x86 -#define SNECR_EEP_DI 0x10 /* EEPROM Serial Data Input (high) */ -#define SNECR_EEP_CS 0x20 /* EEPROM Chip Select (high) */ -#define SNECR_EEP_SK 0x40 /* EEPROM Serial Data Clock (high) */ -#define SNECR_EEP_DO 0x80 /* EEPROM Serial Data Output (high) */ - -/* EEPROM data locations */ -#define SNEC_EEPROM_KEY0 6 /* Station Address Check Sum Key #1 */ -#define SNEC_EEPROM_KEY1 7 /* Station Address Check Sum Key #2 */ -#define SNEC_EEPROM_SA0 8 /* Station Address #1 */ -#define SNEC_EEPROM_SA1 9 /* Station Address #2 */ -#define SNEC_EEPROM_SA2 10 /* Station Address #3 */ -#define SNEC_EEPROM_SA3 11 /* Station Address #4 */ -#define SNEC_EEPROM_SA4 12 /* Station Address #5 */ -#define SNEC_EEPROM_SA5 13 /* Station Address #6 */ -#define SNEC_EEPROM_CKSUM 14 /* Station Address Check Sum */ - -#define SNEC_EEPROM_SIZE 32 /* valid EEPROM data (max 128 bytes) */ - -/* - * Bus and Mode Identification Register (IDENT) - */ -#define SNECR_IDENT 0x88 - /* Bit 0: Bus Identification. */ -#define SNECR_IDENT_CBUS 0x01 /* on PC-98 C-Bus */ -#define SNECR_IDENT_PCMCIABUS 0x00 /* on PCMCIA Bus */ - /* Bit 2: always 1 */ -#define SNECR_IDENT_MAGIC 0x04 - /* Bit 4: Bus Configuration Mode Identification. */ -#define SNECR_IDENT_PNP 0x10 /* Plug and Play (C-Bus and PCMCIA) */ -#define SNECR_IDENT_LEGACY 0x00 /* Legacy C-Bus */ - -#define SNECR_IDENT_LEGACY_CBUS \ - (SNECR_IDENT_LEGACY | SNECR_IDENT_MAGIC | SNECR_IDENT_CBUS) -#define SNECR_IDENT_PNP_CBUS \ - (SNECR_IDENT_PNP | SNECR_IDENT_MAGIC | SNECR_IDENT_CBUS) -#define SNECR_IDENT_PNP_PCMCIABUS \ - (SNECR_IDENT_PNP | SNECR_IDENT_MAGIC | SNECR_IDENT_PCMCIABUS) - -/* - * XXX: parent bus type aliases - */ -#define SNEC_TYPE_LEGACY 0 -#define SNEC_TYPE_PNP 1 - diff --git a/sys/dev/snc/if_sncvar.h b/sys/dev/snc/if_sncvar.h deleted file mode 100644 index 05d699be0c3b..000000000000 --- a/sys/dev/snc/if_sncvar.h +++ /dev/null @@ -1,47 +0,0 @@ -/*- - * Copyright (c) 1995, David Greenman - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice unmodified, this list of conditions, and the following - * disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * $FreeBSD$ - */ - -/* - * National Semiconductor DP8393X SONIC Driver - * - * This is the machine dependent attachment on FreeBSD 4.x - * written by Motomichi Matsuzaki <mzaki@e-mail.ne.jp> - */ - -extern devclass_t snc_devclass; - -void snc_release_resources (device_t); -int snc_alloc_port (device_t, int); -int snc_alloc_memory (device_t, int); -int snc_alloc_irq (device_t, int, int); - -int snc_probe (device_t, int); -int snc_attach (device_t); - -int snc_shutdown (device_t); diff --git a/sys/dev/sound/isa/mss.c b/sys/dev/sound/isa/mss.c index 4f5548e91ff5..68ae2d9de065 100644 --- a/sys/dev/sound/isa/mss.c +++ b/sys/dev/sound/isa/mss.c @@ -96,9 +96,7 @@ static driver_intr_t mss_intr; /* prototypes for local functions */ static int mss_detect(device_t dev, struct mss_info *mss); -#ifndef PC98 static int opti_detect(device_t dev, struct mss_info *mss); -#endif static char *ymf_test(device_t dev, struct mss_info *mss); static void ad_unmute(struct mss_info *mss); @@ -117,9 +115,7 @@ static void ad_leave_MCE(struct mss_info *mss); /* OPTi-specific functions */ static void opti_write(struct mss_info *mss, u_char reg, u_char data); -#ifndef PC98 static u_char opti_read(struct mss_info *mss, u_char reg); -#endif static int opti_init(device_t dev, struct mss_info *mss); /* io primitives */ @@ -1330,11 +1326,7 @@ mss_probe(device_t dev) rman_get_start(mss->io_base), tmpx)); goto no; } -#ifdef PC98 - if (irq > 12) { -#else if (irq > 11) { -#endif printf("MSS: Bad IRQ %d\n", irq); goto no; } @@ -1381,7 +1373,6 @@ mss_detect(device_t dev, struct mss_info *mss) name = "AD1848"; mss->bd_id = MD_AD1848; /* AD1848 or CS4248 */ -#ifndef PC98 if (opti_detect(dev, mss)) { switch (mss->bd_id) { case MD_OPTI924: @@ -1394,7 +1385,6 @@ mss_detect(device_t dev, struct mss_info *mss) printf("Found OPTi device %s\n", name); if (opti_init(dev, mss) == 0) goto gotit; } -#endif /* * Check that the I/O address is in use. @@ -1601,7 +1591,6 @@ no: return ENXIO; } -#ifndef PC98 static int opti_detect(device_t dev, struct mss_info *mss) { @@ -1647,7 +1636,6 @@ opti_detect(device_t dev, struct mss_info *mss) } return 0; } -#endif static char * ymf_test(device_t dev, struct mss_info *mss) @@ -1682,10 +1670,6 @@ ymf_test(device_t dev, struct mss_info *mss) if (!j) { bus_release_resource(dev, SYS_RES_IOPORT, mss->conf_rid, mss->conf_base); -#ifdef PC98 - /* PC98 need this. I don't know reason why. */ - bus_delete_resource(dev, SYS_RES_IOPORT, mss->conf_rid); -#endif mss->conf_base = NULL; continue; } @@ -1709,23 +1693,16 @@ mss_doattach(device_t dev, struct mss_info *mss) rdma = rman_get_start(mss->drq2); if (flags & DV_F_TRUE_MSS) { /* has IRQ/DMA registers, set IRQ and DMA addr */ -#ifdef PC98 /* CS423[12] in PC98 can use IRQ3,5,10,12 */ - static char interrupt_bits[13] = - {-1, -1, -1, 0x08, -1, 0x10, -1, -1, -1, -1, 0x18, -1, 0x20}; -#else static char interrupt_bits[12] = {-1, -1, -1, -1, -1, 0x28, -1, 0x08, -1, 0x10, 0x18, 0x20}; -#endif static char pdma_bits[4] = {1, 2, -1, 3}; static char valid_rdma[4] = {1, 0, -1, 0}; char bits; if (!mss->irq || (bits = interrupt_bits[rman_get_start(mss->irq)]) == -1) goto no; -#ifndef PC98 /* CS423[12] in PC98 don't support this. */ io_wr(mss, 0, bits | 0x40); /* config port */ if ((io_rd(mss, 3) & 0x40) == 0) device_printf(dev, "IRQ Conflict?\n"); -#endif /* Write IRQ+DMA setup */ if (pdma_bits[pdma] == -1) goto no; bits |= pdma_bits[pdma]; @@ -2184,7 +2161,6 @@ opti_write(struct mss_info *mss, u_char reg, u_char val) } } -#ifndef PC98 u_char opti_read(struct mss_info *mss, u_char reg) { @@ -2208,7 +2184,6 @@ opti_read(struct mss_info *mss, u_char reg) } return -1; } -#endif static device_method_t pnpmss_methods[] = { /* Device interface */ diff --git a/sys/dev/sound/isa/mss.h b/sys/dev/sound/isa/mss.h index aaa28c0e8f8a..1b4147de9a90 100644 --- a/sys/dev/sound/isa/mss.h +++ b/sys/dev/sound/isa/mss.h @@ -215,20 +215,12 @@ mixer_ent mix_devices[32][2] = { MIX_NONE(SOUND_MIXER_VOLUME), MIX_NONE(SOUND_MIXER_BASS), MIX_NONE(SOUND_MIXER_TREBLE), -#ifdef PC98 /* PC98's synth is assigned to AUX#2 */ -MIX_ENT(SOUND_MIXER_SYNTH, 4, 1, 0, 5, 5, 1, 0, 5), -#else /* AT386's synth is assigned to AUX#1 */ MIX_ENT(SOUND_MIXER_SYNTH, 2, 1, 0, 5, 3, 1, 0, 5), -#endif MIX_ENT(SOUND_MIXER_PCM, 6, 1, 0, 6, 7, 1, 0, 6), MIX_ENT(SOUND_MIXER_SPEAKER, 26, 1, 0, 4, 0, 0, 0, 0), MIX_ENT(SOUND_MIXER_LINE, 18, 1, 0, 5, 19, 1, 0, 5), MIX_ENT(SOUND_MIXER_MIC, 0, 0, 5, 1, 1, 0, 5, 1), -#ifdef PC98 /* PC98's cd-audio is assigned to AUX#1 */ -MIX_ENT(SOUND_MIXER_CD, 2, 1, 0, 5, 3, 1, 0, 5), -#else /* AT386's cd-audio is assigned to AUX#2 */ MIX_ENT(SOUND_MIXER_CD, 4, 1, 0, 5, 5, 1, 0, 5), -#endif MIX_ENT(SOUND_MIXER_IMIX, 13, 1, 2, 6, 0, 0, 0, 0), MIX_NONE(SOUND_MIXER_ALTPCM), MIX_NONE(SOUND_MIXER_RECLEV), diff --git a/sys/dev/sound/isa/sbc.c b/sys/dev/sound/isa/sbc.c index 6a8e1d34f144..25fcd15c7d1d 100644 --- a/sys/dev/sound/isa/sbc.c +++ b/sys/dev/sound/isa/sbc.c @@ -98,20 +98,6 @@ static devclass_t sbc_devclass; static int io_range[3] = {0x10, 0x2, 0x4}; -#ifdef PC98 /* I/O address table for PC98 */ -static bus_addr_t pcm_iat[] = { - 0x000, 0x100, 0x200, 0x300, 0x400, 0x500, 0x600, 0x700, - 0x800, 0x900, 0xa00, 0xb00, 0xc00, 0xd00, 0xe00, 0xf00 -}; -static bus_addr_t midi_iat[] = { - 0x000, 0x100 -}; -static bus_addr_t opl_iat[] = { - 0x000, 0x100, 0x200, 0x300 -}; -static bus_addr_t *sb_iat[] = { pcm_iat, midi_iat, opl_iat }; -#endif - static int sb_rd(struct resource *io, int reg); static void sb_wr(struct resource *io, int reg, u_int8_t val); static int sb_dspready(struct resource *io); @@ -297,17 +283,9 @@ sbc_probe(device_t dev) int rid = 0, ver; struct resource *io; -#ifdef PC98 - io = isa_alloc_resourcev(dev, SYS_RES_IOPORT, &rid, - pcm_iat, 16, RF_ACTIVE); -#else io = bus_alloc_resource_anywhere(dev, SYS_RES_IOPORT, &rid, 16, RF_ACTIVE); -#endif if (!io) goto bad; -#ifdef PC98 - isa_load_resourcev(io, pcm_iat, 16); -#endif if (sb_reset_dsp(io)) goto bad2; ver = sb_identify_board(io); if (ver == 0) goto bad2; @@ -399,20 +377,6 @@ sbc_attach(device_t dev) /* soft irq/dma configuration */ x = -1; irq = rman_get_start(scp->irq[0]); -#ifdef PC98 - /* SB16 in PC98 use different IRQ table */ - if (irq == 3) x = 1; - else if (irq == 5) x = 8; - else if (irq == 10) x = 2; - else if (irq == 12) x = 4; - if (x == -1) { - err = "bad irq (3/5/10/12 valid)"; - goto bad; - } - else sb_setmixer(scp->io[0], IRQ_NR, x); - /* SB16 in PC98 use different dma setting */ - sb_setmixer(scp->io[0], DMA_NR, dh == 0 ? 1 : 2); -#else if (irq == 5) x = 2; else if (irq == 7) x = 4; else if (irq == 9) x = 1; @@ -423,7 +387,6 @@ sbc_attach(device_t dev) } else sb_setmixer(scp->io[0], IRQ_NR, x); sb_setmixer(scp->io[0], DMA_NR, (1 << dh) | (1 << dl)); -#endif if (bootverbose) { device_printf(dev, "setting card to irq %d, drq %d", irq, dl); if (dl != dh) printf(", %d", dh); @@ -578,22 +541,13 @@ sbc_alloc_resource(device_t bus, device_t child, int type, int *rid, struct sbc_softc *scp; int *alloced, rid_max, alloced_max; struct resource **res; -#ifdef PC98 - int i; -#endif scp = device_get_softc(bus); switch (type) { case SYS_RES_IOPORT: alloced = scp->io_alloced; res = scp->io; -#ifdef PC98 - rid_max = 0; - for (i = 0; i < IO_MAX; i++) - rid_max += io_range[i]; -#else rid_max = IO_MAX - 1; -#endif alloced_max = 1; break; case SYS_RES_DRQ: @@ -694,26 +648,12 @@ alloc_resource(struct sbc_softc *scp) for (i = 0 ; i < IO_MAX ; i++) { if (scp->io[i] == NULL) { -#ifdef PC98 - scp->io_rid[i] = i > 0 ? - scp->io_rid[i - 1] + io_range[i - 1] : 0; - scp->io[i] = isa_alloc_resourcev(scp->dev, - SYS_RES_IOPORT, - &scp->io_rid[i], - sb_iat[i], - io_range[i], - RF_ACTIVE); - if (scp->io[i] != NULL) - isa_load_resourcev(scp->io[i], sb_iat[i], - io_range[i]); -#else scp->io_rid[i] = i; scp->io[i] = bus_alloc_resource_anywhere(scp->dev, SYS_RES_IOPORT, &scp->io_rid[i], io_range[i], RF_ACTIVE); -#endif if (i == 0 && scp->io[i] == NULL) return (1); scp->io_alloced[i] = 0; diff --git a/sys/dev/syscons/daemon/daemon_saver.c b/sys/dev/syscons/daemon/daemon_saver.c index 1a92ff9afef1..5b30a398e7bc 100644 --- a/sys/dev/syscons/daemon/daemon_saver.c +++ b/sys/dev/syscons/daemon/daemon_saver.c @@ -371,15 +371,7 @@ daemon_init(video_adapter_t *adp) sprintf(message, "%s - %s %s", prison0.pr_hostname, ostype, osrelease); mtx_unlock(&prison0.pr_mtx); blanked = 0; - switch (adp->va_mode) { - case M_PC98_80x25: - case M_PC98_80x30: - attr_mask = ~FG_UNDERLINE; - break; - default: - attr_mask = ~0; - break; - } + attr_mask = ~0; return 0; } diff --git a/sys/dev/syscons/dragon/dragon_saver.c b/sys/dev/syscons/dragon/dragon_saver.c index 6294daa77615..df29d8277f03 100644 --- a/sys/dev/syscons/dragon/dragon_saver.c +++ b/sys/dev/syscons/dragon/dragon_saver.c @@ -47,17 +47,10 @@ static u_char *vid; static int blanked; -#ifdef PC98 -#define VIDEO_MODE M_PC98_EGC640x400 -#define VIDEO_MODE_NAME "M_PC98_EGC640x400" -#define SCRW 640 -#define SCRH 400 -#else #define VIDEO_MODE M_VGA_CG320 #define VIDEO_MODE_NAME "M_VGA_CG320" #define SCRW 320 #define SCRH 200 -#endif #define ORDER 13 #define CURVE 3 #define OUT 100 @@ -72,11 +65,7 @@ gpset(int x, int y, int val) if (x < 0 || y < 0 || SCRW <= x || SCRH <= y) { return 0; } -#ifdef PC98 - vid[(x + y * SCRW) >> 3] = (0x80 >> (x & 7)); /* write new dot */ -#else vid[x + y * SCRW] = val; -#endif return 1; } @@ -86,11 +75,6 @@ gdraw(int dx, int dy, int val) int i; int set = 0; -#ifdef PC98 - outb(0x7c, 0xcc); /* GRCG on & RMW mode(disable planeI,G) */ - outb(0x7e, (val & 1) ? 0xff: 0); /* tile B */ - outb(0x7e, (val & 2) ? 0xff: 0); /* tile R */ -#endif if (dx != 0) { i = cur_x; cur_x += dx; @@ -115,9 +99,6 @@ gdraw(int dx, int dy, int val) set |= gpset(cur_x, i, val); } } -#ifdef PC98 - outb(0x7c, 0); /* GRCG off */ -#endif return set; } diff --git a/sys/dev/syscons/fire/fire_saver.c b/sys/dev/syscons/fire/fire_saver.c index 4c995efcd640..4b0a0e00a604 100644 --- a/sys/dev/syscons/fire/fire_saver.c +++ b/sys/dev/syscons/fire/fire_saver.c @@ -143,10 +143,6 @@ fire_init(video_adapter_t *adp) if (!vidd_get_info(adp, M_VGA_CG320, &info)) { scrmode = M_VGA_CG320; - } else if (!vidd_get_info(adp, M_PC98_PEGC640x480, &info)) { - scrmode = M_PC98_PEGC640x480; - } else if (!vidd_get_info(adp, M_PC98_PEGC640x400, &info)) { - scrmode = M_PC98_PEGC640x400; } else { log(LOG_NOTICE, "%s: the console does not support M_VGA_CG320\n", diff --git a/sys/dev/syscons/logo/logo_saver.c b/sys/dev/syscons/logo/logo_saver.c index 5828d7e44bd6..071261ead62d 100644 --- a/sys/dev/syscons/logo/logo_saver.c +++ b/sys/dev/syscons/logo/logo_saver.c @@ -140,10 +140,6 @@ logo_init(video_adapter_t *adp) scrmode = M_VESA_CG800x600; } else if (!vidd_get_info(adp, M_VGA_CG320, &info)) { scrmode = M_VGA_CG320; - } else if (!vidd_get_info(adp, M_PC98_PEGC640x480, &info)) { - scrmode = M_PC98_PEGC640x480; - } else if (!vidd_get_info(adp, M_PC98_PEGC640x400, &info)) { - scrmode = M_PC98_PEGC640x400; } else { log(LOG_NOTICE, "%s: the console does not support M_VGA_CG320\n", diff --git a/sys/dev/syscons/plasma/plasma_saver.c b/sys/dev/syscons/plasma/plasma_saver.c index 761aa5cc5752..376c639231e0 100644 --- a/sys/dev/syscons/plasma/plasma_saver.c +++ b/sys/dev/syscons/plasma/plasma_saver.c @@ -49,8 +49,6 @@ */ static int modes[] = { M_VGA_CG640, - M_PC98_PEGC640x480, - M_PC98_PEGC640x400, M_VGA_CG320, -1 }; diff --git a/sys/dev/syscons/rain/rain_saver.c b/sys/dev/syscons/rain/rain_saver.c index ff2892416b97..1ddbdc748451 100644 --- a/sys/dev/syscons/rain/rain_saver.c +++ b/sys/dev/syscons/rain/rain_saver.c @@ -143,10 +143,6 @@ rain_init(video_adapter_t *adp) if (!vidd_get_info(adp, M_VGA_CG320, &info)) { scrmode = M_VGA_CG320; - } else if (!vidd_get_info(adp, M_PC98_PEGC640x480, &info)) { - scrmode = M_PC98_PEGC640x480; - } else if (!vidd_get_info(adp, M_PC98_PEGC640x400, &info)) { - scrmode = M_PC98_PEGC640x400; } else { log(LOG_NOTICE, "%s: the console does not support M_VGA_CG320\n", diff --git a/sys/dev/syscons/scmouse.c b/sys/dev/syscons/scmouse.c index db26787c264e..f96c157cb4b5 100644 --- a/sys/dev/syscons/scmouse.c +++ b/sys/dev/syscons/scmouse.c @@ -249,7 +249,6 @@ sc_remove_mouse_image(scr_stat *scp) i = scp->mouse_oldpos; mark_for_update(scp, i); mark_for_update(scp, i); -#ifndef PC98 if (i + scp->xsize + 1 < size) { mark_for_update(scp, i + scp->xsize + 1); } else if (i + scp->xsize < size) { @@ -257,7 +256,6 @@ sc_remove_mouse_image(scr_stat *scp) } else if (i + 1 < size) { mark_for_update(scp, i + 1); } -#endif /* PC98 */ scp->status &= ~MOUSE_VISIBLE; SC_VIDEO_UNLOCK(scp->sc); } diff --git a/sys/dev/syscons/scvidctl.c b/sys/dev/syscons/scvidctl.c index 6ae923dfe291..0176147dcd51 100644 --- a/sys/dev/syscons/scvidctl.c +++ b/sys/dev/syscons/scvidctl.c @@ -655,12 +655,6 @@ sc_vid_ioctl(struct tty *tp, u_long cmd, caddr_t data, struct thread *td) case SW_ENH_B80x25: case SW_ENH_C80x25: case SW_ENH_B80x43: case SW_ENH_C80x43: case SW_EGAMONO80x25: - -#ifdef PC98 - /* PC98 TEXT MODES */ - case SW_PC98_80x25: - case SW_PC98_80x30: -#endif if (!(adp->va_flags & V_ADP_MODECHANGE)) return ENODEV; return sc_set_text_mode(scp, tp, cmd & 0xff, 0, 0, 0, 0); @@ -671,11 +665,6 @@ sc_vid_ioctl(struct tty *tp, u_long cmd, caddr_t data, struct thread *td) case SW_CG640x350: case SW_ENH_CG640: case SW_BG640x480: case SW_CG640x480: case SW_VGA_CG320: case SW_VGA_MODEX: -#ifdef PC98 - /* PC98 GRAPHICS MODES */ - case SW_PC98_EGC640x400: case SW_PC98_PEGC640x400: - case SW_PC98_PEGC640x480: -#endif if (!(adp->va_flags & V_ADP_MODECHANGE)) return ENODEV; return sc_set_graphics_mode(scp, tp, cmd & 0xff); @@ -725,10 +714,8 @@ sc_vid_ioctl(struct tty *tp, u_long cmd, caddr_t data, struct thread *td) vidd_load_palette(adp, scp->sc->palette); #endif -#ifndef PC98 /* move hardware cursor out of the way */ vidd_set_hw_cursor(adp, -1, -1); -#endif /* FALLTHROUGH */ @@ -744,7 +731,6 @@ sc_vid_ioctl(struct tty *tp, u_long cmd, caddr_t data, struct thread *td) splx(s); return error; } -#ifndef PC98 scp->status |= UNKNOWN_MODE | MOUSE_HIDDEN; splx(s); /* no restore fonts & palette */ @@ -752,14 +738,6 @@ sc_vid_ioctl(struct tty *tp, u_long cmd, caddr_t data, struct thread *td) set_mode(scp); sc_clear_screen(scp); scp->status &= ~UNKNOWN_MODE; -#else /* PC98 */ - scp->status &= ~UNKNOWN_MODE; - /* no restore fonts & palette */ - if (scp == scp->sc->cur_scp) - set_mode(scp); - sc_clear_screen(scp); - splx(s); -#endif /* PC98 */ return 0; #ifdef SC_PIXEL_MODE @@ -798,10 +776,6 @@ sc_vid_ioctl(struct tty *tp, u_long cmd, caddr_t data, struct thread *td) } scp->status |= UNKNOWN_MODE | MOUSE_HIDDEN; splx(s); -#ifdef PC98 - if (scp == scp->sc->cur_scp) - set_mode(scp); -#endif return 0; default: diff --git a/sys/dev/syscons/star/star_saver.c b/sys/dev/syscons/star/star_saver.c index 56bfc011eb50..e8e60415eed3 100644 --- a/sys/dev/syscons/star/star_saver.c +++ b/sys/dev/syscons/star/star_saver.c @@ -58,9 +58,6 @@ star_saver(video_adapter_t *adp, int blank) static u_char pattern[] = {"...........++++*** "}; static char color16[] = {FG_DARKGREY, FG_LIGHTGREY, FG_WHITE, FG_LIGHTCYAN}; - static char color8[] = {FG_BLUE, FG_BROWN, - FG_LIGHTGREY, FG_CYAN}; - static char *colors; static u_short stars[NUM_STARS][2]; sc = sc_find_softc(adp, NULL); @@ -72,16 +69,6 @@ star_saver(video_adapter_t *adp, int blank) if (adp->va_info.vi_flags & V_INFO_GRAPHICS) return EAGAIN; if (!blanked) { - switch (adp->va_mode) { - case M_PC98_80x25: - case M_PC98_80x30: - colors = color8; - break; - default: - colors = color16; - break; - } - /* clear the screen and set the border color */ sc_vtb_clear(&scp->scr, sc->scr_map[0x20], (FG_LIGHTGREY | BG_BLACK) << 8); @@ -97,7 +84,7 @@ star_saver(video_adapter_t *adp, int blank) cell = random() % NUM_STARS; sc_vtb_putc(&scp->scr, stars[cell][0], sc->scr_map[pattern[stars[cell][1]]], - colors[random()%sizeof(color16)] << 8); + color16[random()%sizeof(color16)] << 8); if ((stars[cell][1]+=(random()%4)) >= sizeof(pattern)-1) { stars[cell][0] = random() % (scp->xsize*scp->ysize); stars[cell][1] = 0; diff --git a/sys/dev/syscons/syscons.c b/sys/dev/syscons/syscons.c index 30c7a1a1327d..5bbfebc52f20 100644 --- a/sys/dev/syscons/syscons.c +++ b/sys/dev/syscons/syscons.c @@ -316,7 +316,6 @@ static char { KD_CGA, { "CGA", "CGA" } }, { KD_EGA, { "EGA", "EGA (mono)" } }, { KD_VGA, { "VGA", "VGA (mono)" } }, - { KD_PC98, { "PC-98x1", "PC-98x1" } }, { KD_TGA, { "TGA", "TGA" } }, { -1, { "Unknown", "Unknown" } }, }; @@ -2012,9 +2011,7 @@ sccnupdate(scr_stat *scp) static void scrn_timer(void *arg) { -#ifndef PC98 static time_t kbd_time_stamp = 0; -#endif sc_softc_t *sc; scr_stat *scp; int again, rate; @@ -2034,7 +2031,6 @@ scrn_timer(void *arg) if (suspend_in_progress || sc->font_loading_in_progress) goto done; -#ifndef PC98 if ((sc->kbd == NULL) && (sc->config & SC_AUTODETECT_KBD)) { /* try to allocate a keyboard automatically */ if (kbd_time_stamp != time_uptime) { @@ -2049,7 +2045,6 @@ scrn_timer(void *arg) } } } -#endif /* PC98 */ /* should we stop the screen saver? */ if (kdb_active || panicstr || shutdown_in_progress) @@ -2809,11 +2804,7 @@ exchange_scr(sc_softc_t *sc) /* set up the video for the new screen */ scp = sc->cur_scp = sc->new_scp; -#ifdef PC98 - if (sc->old_scp->mode != scp->mode || ISUNKNOWNSC(sc->old_scp) || ISUNKNOWNSC(sc->new_scp)) -#else if (sc->old_scp->mode != scp->mode || ISUNKNOWNSC(sc->old_scp)) -#endif set_mode(scp); #ifndef __sparc64__ else @@ -2988,11 +2979,7 @@ scinit(int unit, int flags) * static buffers for the console. This is less than ideal, * but is necessry evil for the time being. XXX */ -#ifdef PC98 - static u_short sc_buffer[ROW*COL*2];/* XXX */ -#else static u_short sc_buffer[ROW*COL]; /* XXX */ -#endif #ifndef SC_NO_FONT_LOADING static u_char font_8[256*8]; static u_char font_14[256*14]; @@ -3193,9 +3180,6 @@ scinit(int unit, int flags) /* initialize mapscrn arrays to a one to one map */ for (i = 0; i < sizeof(sc->scr_map); i++) sc->scr_map[i] = sc->scr_rmap[i] = i; -#ifdef PC98 - sc->scr_map[0x5c] = (u_char)0xfc; /* for backslash */ -#endif sc->flags |= SC_INIT_DONE; } diff --git a/sys/dev/syscons/syscons.h b/sys/dev/syscons/syscons.h index 3454700c9475..24d386afc16b 100644 --- a/sys/dev/syscons/syscons.h +++ b/sys/dev/syscons/syscons.h @@ -38,14 +38,6 @@ #include <sys/_lock.h> #include <sys/_mutex.h> -/* machine-dependent part of the header */ - -#ifdef PC98 -#include <pc98/cbus/sc_machdep.h> -#elif defined(__i386__) -/* nothing for the moment */ -#endif - /* default values for configuration options */ #ifndef MAXCONS diff --git a/sys/dev/syscons/warp/warp_saver.c b/sys/dev/syscons/warp/warp_saver.c index a800118774aa..93383ddaebc9 100644 --- a/sys/dev/syscons/warp/warp_saver.c +++ b/sys/dev/syscons/warp/warp_saver.c @@ -129,10 +129,6 @@ warp_init(video_adapter_t *adp) if (!vidd_get_info(adp, M_VGA_CG320, &info)) { scrmode = M_VGA_CG320; - } else if (!vidd_get_info(adp, M_PC98_PEGC640x480, &info)) { - scrmode = M_PC98_PEGC640x480; - } else if (!vidd_get_info(adp, M_PC98_PEGC640x400, &info)) { - scrmode = M_PC98_PEGC640x400; } else { log(LOG_NOTICE, "%s: the console does not support M_VGA_CG320\n", diff --git a/sys/dev/uart/uart.h b/sys/dev/uart/uart.h index c40846b758de..987f4a0d1bdf 100644 --- a/sys/dev/uart/uart.h +++ b/sys/dev/uart/uart.h @@ -71,10 +71,6 @@ extern struct uart_class uart_sab82532_class __attribute__((weak)); extern struct uart_class uart_sbbc_class __attribute__((weak)); extern struct uart_class uart_z8530_class __attribute__((weak)); -#ifdef PC98 -struct uart_class *uart_pc98_getdev(u_long port); -#endif - /* * Device flags. */ diff --git a/sys/dev/uart/uart_bus_isa.c b/sys/dev/uart/uart_bus_isa.c index 1fda15f2be02..e22bc78a4b9d 100644 --- a/sys/dev/uart/uart_bus_isa.c +++ b/sys/dev/uart/uart_bus_isa.c @@ -146,18 +146,6 @@ static struct isa_pnp_id isa_ns8250_ids[] = { {0x0300695c, NULL}, /* WCI0003 - Fax/Voice/Modem/Speakphone/Asvd */ {0x01a0896a, NULL}, /* ZTIA001 - Zoom Internal V90 Faxmodem */ {0x61f7896a, NULL}, /* ZTIF761 - Zoom ComStar 33.6 */ - /* The following are found in PC98 hardware. */ - {0x4180a3b8, NULL}, /* NEC8041 - PC-9821CB-B04 */ - {0x0181a3b8, NULL}, /* NEC8101 - PC-9821CB2-B04 */ - {0x5181a3b8, NULL}, /* NEC8151 - Internal FAX/Modem for Cx3, Cb3 */ - {0x9181a3b8, NULL}, /* NEC8191 - PC-9801-120 */ - {0xe181a3b8, NULL}, /* NEC81E1 - Internal FAX/Modem */ - {0x1182a3b8, NULL}, /* NEC8211 - PC-9801-123 */ - {0x3182a3b8, NULL}, /* NEC8231 - Internal FAX/Modem (Voice) */ - {0x4182a3b8, NULL}, /* NEC8241 - PC-9821NR-B05 */ - {0x5182a3b8, NULL}, /* NEC8251 - Internel FAX/Modem */ - {0x7182a3b8, NULL}, /* NEC8271 - PC-9801-125 */ - {0x11802fbf, NULL}, /* OYO8011 - Internal FAX/Modem (Ring) */ {0} }; @@ -175,15 +163,8 @@ uart_isa_probe(device_t dev) return (ENXIO); /* Probe PnP _and_ non-PnP ns8250 here. */ -#ifdef PC98 - if (isa_get_logicalid(dev)) - sc->sc_class = &uart_ns8250_class; - else - sc->sc_class = uart_pc98_getdev(bus_get_resource_start(dev, - SYS_RES_IOPORT, 0)); -#else sc->sc_class = &uart_ns8250_class; -#endif + return (uart_bus_probe(dev, 0, 0, 0, 0)); } diff --git a/sys/dev/uart/uart_cpu_pc98.c b/sys/dev/uart/uart_cpu_pc98.c deleted file mode 100644 index c211b3dbe95d..000000000000 --- a/sys/dev/uart/uart_cpu_pc98.c +++ /dev/null @@ -1,132 +0,0 @@ -/*- - * Copyright (c) 2008 TAKAHASHI Yoshihiro - * Copyright (c) 2003 M. Warner Losh, Marcel Moolenaar - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#include <sys/param.h> -#include <sys/systm.h> -#include <sys/bus.h> - -#include <machine/bus.h> - -#include <dev/uart/uart.h> -#include <dev/uart/uart_cpu.h> - -bus_space_tag_t uart_bus_space_io = X86_BUS_SPACE_IO; -bus_space_tag_t uart_bus_space_mem = X86_BUS_SPACE_MEM; - -static struct { - u_long iobase; - struct uart_class *class; -} uart_pc98_devs[] = { - { 0x238, &uart_ns8250_class }, - { 0, NULL } -}; - -struct uart_class * -uart_pc98_getdev(u_long port) -{ - int i; - - for (i = 0; uart_pc98_devs[i].iobase; i++) { - if (port == uart_pc98_devs[i].iobase) - return (uart_pc98_devs[i].class); - } - return (NULL); -} - -int -uart_cpu_eqres(struct uart_bas *b1, struct uart_bas *b2) -{ - - if (bus_space_compare(b1->bst, b1->bsh, b2->bst, b2->bsh) == 0) - return (1); - - return (0); -} - -int -uart_cpu_getdev(int devtype, struct uart_devinfo *di) -{ - struct uart_class *class; - unsigned int i, ivar; - - class = &uart_ns8250_class; - if (class == NULL) - return (ENXIO); - - /* Check the environment. */ - if (uart_getenv(devtype, di, class) == 0) - return (0); - - /* - * There is a serial port on all pc98 hardware. It is 8251 or - * an enhance version of that. Some pc98 have the second serial - * port which is 16550A compatible. - */ - for (i = 0; i < 2; i++) { - if (resource_int_value("uart", i, "flags", &ivar)) - continue; - if (devtype == UART_DEV_CONSOLE && !UART_FLAGS_CONSOLE(ivar)) - continue; - if (devtype == UART_DEV_DBGPORT && !UART_FLAGS_DBGPORT(ivar)) - continue; - /* - * We have a possible device. Make sure it's enabled and - * that we have an I/O port. - */ - if (resource_int_value("uart", i, "disabled", &ivar) == 0 && - ivar != 0) - continue; - if (resource_int_value("uart", i, "port", &ivar) != 0 || - ivar == 0) - continue; - - class = uart_pc98_getdev(ivar); - if (class == NULL) - continue; - - di->ops = uart_getops(class); - di->bas.chan = 0; - di->bas.bst = uart_bus_space_io; - if (bus_space_map(di->bas.bst, ivar, uart_getrange(class), 0, - &di->bas.bsh) != 0) - continue; - di->bas.regshft = 0; - di->bas.rclk = 0; - if (resource_int_value("uart", i, "baud", &ivar) != 0) - ivar = 0; - di->baudrate = ivar; - di->databits = 8; - di->stopbits = 1; - di->parity = UART_PARITY_NONE; - return (0); - } - - return (ENXIO); -} diff --git a/sys/geom/geom_bsd.c b/sys/geom/geom_bsd.c index 6cb65cd0366c..be3ec333aec9 100644 --- a/sys/geom/geom_bsd.c +++ b/sys/geom/geom_bsd.c @@ -441,16 +441,6 @@ g_bsd_taste(struct g_class *mp, struct g_provider *pp, int flags) break; } - /* Same thing if we are inside a PC98 */ - error = g_getattr("PC98::type", cp, &i); - if (!error) { - if (i != 0xc494 && flags == G_TF_NORMAL) - break; - error = g_getattr("PC98::offset", cp, &ms->mbroffset); - if (error) - break; - } - /* Same thing if we are inside a GPT */ error = g_getattr("GPT::type", cp, &uuid); if (!error) { diff --git a/sys/geom/geom_pc98.c b/sys/geom/geom_pc98.c deleted file mode 100644 index f4435cb103a9..000000000000 --- a/sys/geom/geom_pc98.c +++ /dev/null @@ -1,372 +0,0 @@ -/*- - * Copyright (c) 2002 Poul-Henning Kamp - * Copyright (c) 2002 Networks Associates Technology, Inc. - * All rights reserved. - * - * This software was developed for the FreeBSD Project by Poul-Henning Kamp - * and NAI Labs, the Security Research Division of Network Associates, Inc. - * under DARPA/SPAWAR contract N66001-01-C-8035 ("CBOSS"), as part of the - * DARPA CHATS research program. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#include <sys/param.h> -#include <sys/endian.h> -#include <sys/systm.h> -#include <sys/sysctl.h> -#include <sys/kernel.h> -#include <sys/fcntl.h> -#include <sys/malloc.h> -#include <sys/bio.h> -#include <sys/lock.h> -#include <sys/mutex.h> -#include <sys/proc.h> -#include <sys/sbuf.h> - -#include <sys/diskpc98.h> -#include <geom/geom.h> -#include <geom/geom_slice.h> - -FEATURE(geom_pc98, "GEOM NEC PC9800 partitioning support"); - -#define PC98_CLASS_NAME "PC98" - -struct g_pc98_softc { - u_int fwsectors, fwheads, sectorsize; - int type[PC98_NPARTS]; - u_char sec[8192]; -}; - -static void -g_pc98_print(int i, struct pc98_partition *dp) -{ - char sname[17]; - - strncpy(sname, dp->dp_name, 16); - sname[16] = '\0'; - - hexdump(dp, sizeof(dp[0]), NULL, 0); - printf("[%d] mid:%d(0x%x) sid:%d(0x%x)", - i, dp->dp_mid, dp->dp_mid, dp->dp_sid, dp->dp_sid); - printf(" s:%d/%d/%d", dp->dp_scyl, dp->dp_shd, dp->dp_ssect); - printf(" e:%d/%d/%d", dp->dp_ecyl, dp->dp_ehd, dp->dp_esect); - printf(" sname:%s\n", sname); -} - -/* - * XXX: Add gctl_req arg and give good error msgs. - * XXX: Check that length argument does not bring boot code inside any slice. - */ -static int -g_pc98_modify(struct g_geom *gp, struct g_pc98_softc *ms, u_char *sec, int len __unused) -{ - int i, error; - off_t s[PC98_NPARTS], l[PC98_NPARTS]; - struct pc98_partition dp[PC98_NPARTS]; - - g_topology_assert(); - - if (sec[0x1fe] != 0x55 || sec[0x1ff] != 0xaa) - return (EBUSY); - -#if 0 - /* - * By convetion, it seems that the ipl program has a jump at location - * 0 to the real start of the boot loader. By convetion, it appears - * that after this jump, there's a string, terminated by at last one, - * if not more, zeros, followed by the target of the jump. FreeBSD's - * pc98 boot0 uses 'IPL1' followed by 3 zeros here, likely for - * compatibility with some older boot loader. Linux98's boot loader - * appears to use 'Linux 98' followed by only two. GRUB/98 appears to - * use 'GRUB/98 ' followed by none. These last two appear to be - * ported from the ia32 versions, but appear to show similar - * convention. Grub/98 has an additional NOP after the jmp, which - * isn't present in others. - * - * The following test was inspired by looking only at partitions - * with FreeBSD's boot0 (or one that it is compatible with). As - * such, if failed when other IPL programs were used. - */ - if (sec[4] != 'I' || sec[5] != 'P' || sec[6] != 'L' || sec[7] != '1') - return (EBUSY); -#endif - - for (i = 0; i < PC98_NPARTS; i++) - pc98_partition_dec( - sec + 512 + i * sizeof(struct pc98_partition), &dp[i]); - - for (i = 0; i < PC98_NPARTS; i++) { - /* If start and end are identical it's bogus */ - if (dp[i].dp_ssect == dp[i].dp_esect && - dp[i].dp_shd == dp[i].dp_ehd && - dp[i].dp_scyl == dp[i].dp_ecyl) - s[i] = l[i] = 0; - else if (dp[i].dp_ecyl == 0) - s[i] = l[i] = 0; - else { - s[i] = (off_t)dp[i].dp_scyl * - ms->fwsectors * ms->fwheads * ms->sectorsize; - l[i] = (off_t)(dp[i].dp_ecyl - dp[i].dp_scyl + 1) * - ms->fwsectors * ms->fwheads * ms->sectorsize; - } - if (bootverbose) { - printf("PC98 Slice %d on %s:\n", i + 1, gp->name); - g_pc98_print(i, dp + i); - } - if (s[i] < 0 || l[i] < 0) - error = EBUSY; - else - error = g_slice_config(gp, i, G_SLICE_CONFIG_CHECK, - s[i], l[i], ms->sectorsize, - "%ss%d", gp->name, i + 1); - if (error) - return (error); - } - - for (i = 0; i < PC98_NPARTS; i++) { - ms->type[i] = (dp[i].dp_sid << 8) | dp[i].dp_mid; - g_slice_config(gp, i, G_SLICE_CONFIG_SET, s[i], l[i], - ms->sectorsize, "%ss%d", gp->name, i + 1); - } - - bcopy(sec, ms->sec, sizeof (ms->sec)); - - return (0); -} - -static int -g_pc98_ioctl(struct g_provider *pp, u_long cmd, void *data, int fflag, struct thread *td) -{ - struct g_geom *gp; - struct g_pc98_softc *ms; - struct g_slicer *gsp; - struct g_consumer *cp; - int error, opened; - - gp = pp->geom; - gsp = gp->softc; - ms = gsp->softc; - - opened = 0; - error = 0; - switch(cmd) { - case DIOCSPC98: { - if (!(fflag & FWRITE)) - return (EPERM); - g_topology_lock(); - cp = LIST_FIRST(&gp->consumer); - if (cp->acw == 0) { - error = g_access(cp, 0, 1, 0); - if (error == 0) - opened = 1; - } - if (!error) - error = g_pc98_modify(gp, ms, data, 8192); - if (!error) - error = g_write_data(cp, 0, data, 8192); - if (opened) - g_access(cp, 0, -1 , 0); - g_topology_unlock(); - return(error); - } - default: - return (ENOIOCTL); - } -} - -static int -g_pc98_start(struct bio *bp) -{ - struct g_provider *pp; - struct g_geom *gp; - struct g_pc98_softc *mp; - struct g_slicer *gsp; - int idx; - - pp = bp->bio_to; - idx = pp->index; - gp = pp->geom; - gsp = gp->softc; - mp = gsp->softc; - if (bp->bio_cmd == BIO_GETATTR) { - if (g_handleattr_int(bp, "PC98::type", mp->type[idx])) - return (1); - if (g_handleattr_off_t(bp, "PC98::offset", - gsp->slices[idx].offset)) - return (1); - } - - return (0); -} - -static void -g_pc98_dumpconf(struct sbuf *sb, const char *indent, struct g_geom *gp, - struct g_consumer *cp __unused, struct g_provider *pp) -{ - struct g_pc98_softc *mp; - struct g_slicer *gsp; - struct pc98_partition dp; - char sname[17]; - - gsp = gp->softc; - mp = gsp->softc; - g_slice_dumpconf(sb, indent, gp, cp, pp); - if (pp != NULL) { - pc98_partition_dec( - mp->sec + 512 + - pp->index * sizeof(struct pc98_partition), &dp); - strncpy(sname, dp.dp_name, 16); - sname[16] = '\0'; - if (indent == NULL) { - sbuf_printf(sb, " ty %d", mp->type[pp->index]); - sbuf_printf(sb, " sn %s", sname); - } else { - sbuf_printf(sb, "%s<type>%d</type>\n", indent, - mp->type[pp->index]); - sbuf_printf(sb, "%s<sname>%s</sname>\n", indent, - sname); - } - } -} - -static struct g_geom * -g_pc98_taste(struct g_class *mp, struct g_provider *pp, int flags) -{ - struct g_geom *gp; - struct g_consumer *cp; - int error; - struct g_pc98_softc *ms; - u_int fwsectors, fwheads, sectorsize; - u_char *buf; - - g_trace(G_T_TOPOLOGY, "g_pc98_taste(%s,%s)", mp->name, pp->name); - g_topology_assert(); - if (flags == G_TF_NORMAL && - !strcmp(pp->geom->class->name, PC98_CLASS_NAME)) - return (NULL); - gp = g_slice_new(mp, PC98_NPARTS, pp, &cp, &ms, sizeof *ms, - g_pc98_start); - if (gp == NULL) - return (NULL); - g_topology_unlock(); - do { - if (gp->rank != 2 && flags == G_TF_NORMAL) - break; - error = g_getattr("GEOM::fwsectors", cp, &fwsectors); - if (error || fwsectors == 0) { - fwsectors = 17; - if (bootverbose) - printf("g_pc98_taste: guessing %d sectors\n", - fwsectors); - } - error = g_getattr("GEOM::fwheads", cp, &fwheads); - if (error || fwheads == 0) { - fwheads = 8; - if (bootverbose) - printf("g_pc98_taste: guessing %d heads\n", - fwheads); - } - sectorsize = cp->provider->sectorsize; - if (sectorsize % 512 != 0) - break; - buf = g_read_data(cp, 0, 8192, NULL); - if (buf == NULL) - break; - ms->fwsectors = fwsectors; - ms->fwheads = fwheads; - ms->sectorsize = sectorsize; - g_topology_lock(); - g_pc98_modify(gp, ms, buf, 8192); - g_topology_unlock(); - g_free(buf); - break; - } while (0); - g_topology_lock(); - g_access(cp, -1, 0, 0); - if (LIST_EMPTY(&gp->provider)) { - g_slice_spoiled(cp); - return (NULL); - } - return (gp); -} - -static void -g_pc98_config(struct gctl_req *req, struct g_class *mp, const char *verb) -{ - struct g_geom *gp; - struct g_consumer *cp; - struct g_pc98_softc *ms; - struct g_slicer *gsp; - int opened = 0, error = 0; - void *data; - int len; - - g_topology_assert(); - gp = gctl_get_geom(req, mp, "geom"); - if (gp == NULL) - return; - if (strcmp(verb, "write PC98")) { - gctl_error(req, "Unknown verb"); - return; - } - gsp = gp->softc; - ms = gsp->softc; - data = gctl_get_param(req, "data", &len); - if (data == NULL) - return; - if (len < 8192 || (len % 512)) { - gctl_error(req, "Wrong request length"); - return; - } - cp = LIST_FIRST(&gp->consumer); - if (cp->acw == 0) { - error = g_access(cp, 0, 1, 0); - if (error == 0) - opened = 1; - } - if (!error) - error = g_pc98_modify(gp, ms, data, len); - if (error) - gctl_error(req, "conflict with open slices"); - if (!error) - error = g_write_data(cp, 0, data, len); - if (error) - gctl_error(req, "sector zero write failed"); - if (opened) - g_access(cp, 0, -1 , 0); - return; -} - -static struct g_class g_pc98_class = { - .name = PC98_CLASS_NAME, - .version = G_VERSION, - .taste = g_pc98_taste, - .dumpconf = g_pc98_dumpconf, - .ctlreq = g_pc98_config, - .ioctl = g_pc98_ioctl, -}; - -DECLARE_GEOM_CLASS(g_pc98_class, g_pc98); diff --git a/sys/geom/geom_pc98_enc.c b/sys/geom/geom_pc98_enc.c deleted file mode 100644 index cf0f7f3fe7bc..000000000000 --- a/sys/geom/geom_pc98_enc.c +++ /dev/null @@ -1,78 +0,0 @@ -/*- - * Copyright (c) 2003 TAKAHASHI Yoshihiro - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#include <sys/types.h> -#include <sys/diskpc98.h> -#include <sys/endian.h> - -void -pc98_partition_dec(void const *pp, struct pc98_partition *d) -{ - unsigned char const *ptr = pp; - u_int i; - - d->dp_mid = ptr[0]; - d->dp_sid = ptr[1]; - d->dp_dum1 = ptr[2]; - d->dp_dum2 = ptr[3]; - d->dp_ipl_sct = ptr[4]; - d->dp_ipl_head = ptr[5]; - d->dp_ipl_cyl = le16dec(ptr + 6); - d->dp_ssect = ptr[8]; - d->dp_shd = ptr[9]; - d->dp_scyl = le16dec(ptr + 10); - d->dp_esect = ptr[12]; - d->dp_ehd = ptr[13]; - d->dp_ecyl = le16dec(ptr + 14); - for (i = 0; i < sizeof (d->dp_name); i++) - d->dp_name[i] = ptr[16 + i]; -} - -void -pc98_partition_enc(void *pp, struct pc98_partition *d) -{ - unsigned char *ptr = pp; - u_int i; - - ptr[0] = d->dp_mid; - ptr[1] = d->dp_sid; - ptr[2] = d->dp_dum1; - ptr[3] = d->dp_dum2; - ptr[4] = d->dp_ipl_sct; - ptr[5] = d->dp_ipl_head; - le16enc(ptr + 6, d->dp_ipl_cyl); - ptr[8] = d->dp_ssect; - ptr[9] = d->dp_shd; - le16enc(ptr + 10, d->dp_scyl); - ptr[12] = d->dp_esect; - ptr[13] = d->dp_ehd; - le16enc(ptr + 14, d->dp_ecyl); - for (i = 0; i < sizeof (d->dp_name); i++) - ptr[16 + i] = d->dp_name[i]; -} diff --git a/sys/geom/part/g_part_pc98.c b/sys/geom/part/g_part_pc98.c deleted file mode 100644 index 2012d2b28220..000000000000 --- a/sys/geom/part/g_part_pc98.c +++ /dev/null @@ -1,617 +0,0 @@ -/*- - * Copyright (c) 2008 Marcel Moolenaar - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#include <sys/param.h> -#include <sys/bio.h> -#include <sys/diskpc98.h> -#include <sys/endian.h> -#include <sys/kernel.h> -#include <sys/kobj.h> -#include <sys/limits.h> -#include <sys/lock.h> -#include <sys/malloc.h> -#include <sys/mutex.h> -#include <sys/queue.h> -#include <sys/sbuf.h> -#include <sys/systm.h> -#include <sys/sysctl.h> -#include <geom/geom.h> -#include <geom/geom_int.h> -#include <geom/part/g_part.h> - -#include "g_part_if.h" - -FEATURE(geom_part_pc98, "GEOM partitioning class for PC-9800 disk partitions"); - -#define SECSIZE 512 -#define MENUSIZE 7168 -#define BOOTSIZE 8192 - -struct g_part_pc98_table { - struct g_part_table base; - u_char boot[SECSIZE]; - u_char table[SECSIZE]; - u_char menu[MENUSIZE]; -}; - -struct g_part_pc98_entry { - struct g_part_entry base; - struct pc98_partition ent; -}; - -static int g_part_pc98_add(struct g_part_table *, struct g_part_entry *, - struct g_part_parms *); -static int g_part_pc98_bootcode(struct g_part_table *, struct g_part_parms *); -static int g_part_pc98_create(struct g_part_table *, struct g_part_parms *); -static int g_part_pc98_destroy(struct g_part_table *, struct g_part_parms *); -static void g_part_pc98_dumpconf(struct g_part_table *, struct g_part_entry *, - struct sbuf *, const char *); -static int g_part_pc98_dumpto(struct g_part_table *, struct g_part_entry *); -static int g_part_pc98_modify(struct g_part_table *, struct g_part_entry *, - struct g_part_parms *); -static const char *g_part_pc98_name(struct g_part_table *, struct g_part_entry *, - char *, size_t); -static int g_part_pc98_probe(struct g_part_table *, struct g_consumer *); -static int g_part_pc98_read(struct g_part_table *, struct g_consumer *); -static int g_part_pc98_setunset(struct g_part_table *, struct g_part_entry *, - const char *, unsigned int); -static const char *g_part_pc98_type(struct g_part_table *, - struct g_part_entry *, char *, size_t); -static int g_part_pc98_write(struct g_part_table *, struct g_consumer *); -static int g_part_pc98_resize(struct g_part_table *, struct g_part_entry *, - struct g_part_parms *); - -static kobj_method_t g_part_pc98_methods[] = { - KOBJMETHOD(g_part_add, g_part_pc98_add), - KOBJMETHOD(g_part_bootcode, g_part_pc98_bootcode), - KOBJMETHOD(g_part_create, g_part_pc98_create), - KOBJMETHOD(g_part_destroy, g_part_pc98_destroy), - KOBJMETHOD(g_part_dumpconf, g_part_pc98_dumpconf), - KOBJMETHOD(g_part_dumpto, g_part_pc98_dumpto), - KOBJMETHOD(g_part_modify, g_part_pc98_modify), - KOBJMETHOD(g_part_resize, g_part_pc98_resize), - KOBJMETHOD(g_part_name, g_part_pc98_name), - KOBJMETHOD(g_part_probe, g_part_pc98_probe), - KOBJMETHOD(g_part_read, g_part_pc98_read), - KOBJMETHOD(g_part_setunset, g_part_pc98_setunset), - KOBJMETHOD(g_part_type, g_part_pc98_type), - KOBJMETHOD(g_part_write, g_part_pc98_write), - { 0, 0 } -}; - -static struct g_part_scheme g_part_pc98_scheme = { - "PC98", - g_part_pc98_methods, - sizeof(struct g_part_pc98_table), - .gps_entrysz = sizeof(struct g_part_pc98_entry), - .gps_minent = PC98_NPARTS, - .gps_maxent = PC98_NPARTS, - .gps_bootcodesz = BOOTSIZE, -}; -G_PART_SCHEME_DECLARE(g_part_pc98); - -static int -pc98_parse_type(const char *type, u_char *dp_mid, u_char *dp_sid) -{ - const char *alias; - char *endp; - long lt; - - if (type[0] == '!') { - lt = strtol(type + 1, &endp, 0); - if (type[1] == '\0' || *endp != '\0' || lt <= 0 || - lt >= 65536) - return (EINVAL); - /* Make sure the active and bootable flags aren't set. */ - if (lt & ((PC98_SID_ACTIVE << 8) | PC98_MID_BOOTABLE)) - return (ENOATTR); - *dp_mid = (*dp_mid & PC98_MID_BOOTABLE) | (u_char)lt; - *dp_sid = (*dp_sid & PC98_SID_ACTIVE) | (u_char)(lt >> 8); - return (0); - } - alias = g_part_alias_name(G_PART_ALIAS_FREEBSD); - if (!strcasecmp(type, alias)) { - *dp_mid = (*dp_mid & PC98_MID_BOOTABLE) | PC98_MID_386BSD; - *dp_sid = (*dp_sid & PC98_SID_ACTIVE) | PC98_SID_386BSD; - return (0); - } - return (EINVAL); -} - -static int -pc98_set_slicename(const char *label, u_char *dp_name) -{ - int len; - - len = strlen(label); - if (len > sizeof(((struct pc98_partition *)NULL)->dp_name)) - return (EINVAL); - bzero(dp_name, sizeof(((struct pc98_partition *)NULL)->dp_name)); - strncpy(dp_name, label, len); - - return (0); -} - -static void -pc98_set_chs(struct g_part_table *table, uint32_t lba, u_short *cylp, - u_char *hdp, u_char *secp) -{ - uint32_t cyl, hd, sec; - - sec = lba % table->gpt_sectors + 1; - lba /= table->gpt_sectors; - hd = lba % table->gpt_heads; - lba /= table->gpt_heads; - cyl = lba; - - *cylp = htole16(cyl); - *hdp = hd; - *secp = sec; -} - -static int -pc98_align(struct g_part_table *basetable, uint32_t *start, uint32_t *size) -{ - uint32_t cyl; - - cyl = basetable->gpt_heads * basetable->gpt_sectors; - if (*size < cyl) - return (EINVAL); - if (start != NULL && (*start % cyl)) { - *size += (*start % cyl) - cyl; - *start -= (*start % cyl) - cyl; - } - if (*size % cyl) - *size -= (*size % cyl); - if (*size < cyl) - return (EINVAL); - return (0); -} - -static int -g_part_pc98_add(struct g_part_table *basetable, struct g_part_entry *baseentry, - struct g_part_parms *gpp) -{ - struct g_part_pc98_entry *entry; - uint32_t start, size; - int error; - - entry = (struct g_part_pc98_entry *)baseentry; - start = gpp->gpp_start; - size = gpp->gpp_size; - if (pc98_align(basetable, &start, &size) != 0) - return (EINVAL); - if (baseentry->gpe_deleted) - bzero(&entry->ent, sizeof(entry->ent)); - else - entry->ent.dp_mid = entry->ent.dp_sid = 0; - - KASSERT(baseentry->gpe_start <= start, (__func__)); - KASSERT(baseentry->gpe_end >= start + size - 1, (__func__)); - baseentry->gpe_start = start; - baseentry->gpe_end = start + size - 1; - pc98_set_chs(basetable, baseentry->gpe_start, &entry->ent.dp_scyl, - &entry->ent.dp_shd, &entry->ent.dp_ssect); - pc98_set_chs(basetable, baseentry->gpe_end, &entry->ent.dp_ecyl, - &entry->ent.dp_ehd, &entry->ent.dp_esect); - - error = pc98_parse_type(gpp->gpp_type, &entry->ent.dp_mid, - &entry->ent.dp_sid); - if (error) - return (error); - - if (gpp->gpp_parms & G_PART_PARM_LABEL) - return (pc98_set_slicename(gpp->gpp_label, entry->ent.dp_name)); - - return (0); -} - -static int -g_part_pc98_bootcode(struct g_part_table *basetable, struct g_part_parms *gpp) -{ - struct g_part_pc98_table *table; - const u_char *codeptr; - - if (gpp->gpp_codesize != BOOTSIZE) - return (EINVAL); - - table = (struct g_part_pc98_table *)basetable; - codeptr = gpp->gpp_codeptr; - bcopy(codeptr, table->boot, SECSIZE); - bcopy(codeptr + SECSIZE*2, table->menu, MENUSIZE); - - return (0); -} - -static int -g_part_pc98_create(struct g_part_table *basetable, struct g_part_parms *gpp) -{ - struct g_provider *pp; - struct g_part_pc98_table *table; - - pp = gpp->gpp_provider; - if (pp->sectorsize < SECSIZE || pp->mediasize < BOOTSIZE) - return (ENOSPC); - if (pp->sectorsize > SECSIZE) - return (ENXIO); - - basetable->gpt_first = basetable->gpt_heads * basetable->gpt_sectors; - basetable->gpt_last = MIN(pp->mediasize / SECSIZE, UINT32_MAX) - 1; - - table = (struct g_part_pc98_table *)basetable; - le16enc(table->boot + PC98_MAGICOFS, PC98_MAGIC); - return (0); -} - -static int -g_part_pc98_destroy(struct g_part_table *basetable, struct g_part_parms *gpp) -{ - - /* Wipe the first two sectors to clear the partitioning. */ - basetable->gpt_smhead |= 3; - return (0); -} - -static void -g_part_pc98_dumpconf(struct g_part_table *table, - struct g_part_entry *baseentry, struct sbuf *sb, const char *indent) -{ - struct g_part_pc98_entry *entry; - char name[sizeof(entry->ent.dp_name) + 1]; - u_int type; - - entry = (struct g_part_pc98_entry *)baseentry; - if (entry == NULL) { - /* confxml: scheme information */ - return; - } - - type = entry->ent.dp_mid + (entry->ent.dp_sid << 8); - strncpy(name, entry->ent.dp_name, sizeof(name) - 1); - name[sizeof(name) - 1] = '\0'; - if (indent == NULL) { - /* conftxt: libdisk compatibility */ - sbuf_printf(sb, " xs PC98 xt %u sn %s", type, name); - } else { - /* confxml: partition entry information */ - sbuf_printf(sb, "%s<label>", indent); - g_conf_printf_escaped(sb, "%s", name); - sbuf_printf(sb, "</label>\n"); - if (entry->ent.dp_mid & PC98_MID_BOOTABLE) - sbuf_printf(sb, "%s<attrib>bootable</attrib>\n", - indent); - if (entry->ent.dp_sid & PC98_SID_ACTIVE) - sbuf_printf(sb, "%s<attrib>active</attrib>\n", indent); - sbuf_printf(sb, "%s<rawtype>%u</rawtype>\n", indent, - type & 0x7f7f); - } -} - -static int -g_part_pc98_dumpto(struct g_part_table *table, struct g_part_entry *baseentry) -{ - struct g_part_pc98_entry *entry; - - /* Allow dumping to a FreeBSD partition only. */ - entry = (struct g_part_pc98_entry *)baseentry; - return (((entry->ent.dp_mid & PC98_MID_MASK) == PC98_MID_386BSD && - (entry->ent.dp_sid & PC98_SID_MASK) == PC98_SID_386BSD) ? 1 : 0); -} - -static int -g_part_pc98_modify(struct g_part_table *basetable, - struct g_part_entry *baseentry, struct g_part_parms *gpp) -{ - struct g_part_pc98_entry *entry; - int error; - - entry = (struct g_part_pc98_entry *)baseentry; - - if (gpp->gpp_parms & G_PART_PARM_TYPE) { - error = pc98_parse_type(gpp->gpp_type, &entry->ent.dp_mid, - &entry->ent.dp_sid); - if (error) - return (error); - } - - if (gpp->gpp_parms & G_PART_PARM_LABEL) - return (pc98_set_slicename(gpp->gpp_label, entry->ent.dp_name)); - - return (0); -} - -static int -g_part_pc98_resize(struct g_part_table *basetable, - struct g_part_entry *baseentry, struct g_part_parms *gpp) -{ - struct g_part_pc98_entry *entry; - struct g_provider *pp; - uint32_t size; - - if (baseentry == NULL) { - pp = LIST_FIRST(&basetable->gpt_gp->consumer)->provider; - basetable->gpt_last = MIN(pp->mediasize / SECSIZE, - UINT32_MAX) - 1; - return (0); - } - size = gpp->gpp_size; - if (pc98_align(basetable, NULL, &size) != 0) - return (EINVAL); - /* XXX: prevent unexpected shrinking. */ - pp = baseentry->gpe_pp; - if ((g_debugflags & 0x10) == 0 && size < gpp->gpp_size && - pp->mediasize / pp->sectorsize > size) - return (EBUSY); - entry = (struct g_part_pc98_entry *)baseentry; - baseentry->gpe_end = baseentry->gpe_start + size - 1; - pc98_set_chs(basetable, baseentry->gpe_end, &entry->ent.dp_ecyl, - &entry->ent.dp_ehd, &entry->ent.dp_esect); - - return (0); -} - -static const char * -g_part_pc98_name(struct g_part_table *table, struct g_part_entry *baseentry, - char *buf, size_t bufsz) -{ - - snprintf(buf, bufsz, "s%d", baseentry->gpe_index); - return (buf); -} - -static int -g_part_pc98_probe(struct g_part_table *table, struct g_consumer *cp) -{ - struct g_provider *pp; - u_char *buf, *p; - int error, index, res, sum; - uint16_t magic, ecyl, scyl; - - pp = cp->provider; - - /* Sanity-check the provider. */ - if (pp->sectorsize < SECSIZE || pp->mediasize < BOOTSIZE) - return (ENOSPC); - if (pp->sectorsize > SECSIZE) - return (ENXIO); - - /* Check that there's a PC98 partition table. */ - buf = g_read_data(cp, 0L, 2 * SECSIZE, &error); - if (buf == NULL) - return (error); - - /* We goto out on mismatch. */ - res = ENXIO; - - magic = le16dec(buf + PC98_MAGICOFS); - if (magic != PC98_MAGIC) - goto out; - - sum = 0; - for (index = SECSIZE; index < 2 * SECSIZE; index++) - sum += buf[index]; - if (sum == 0) { - res = G_PART_PROBE_PRI_LOW; - goto out; - } - - for (index = 0; index < PC98_NPARTS; index++) { - p = buf + SECSIZE + index * PC98_PARTSIZE; - if (p[0] == 0 || p[1] == 0) /* !dp_mid || !dp_sid */ - continue; - scyl = le16dec(p + 10); - ecyl = le16dec(p + 14); - if (scyl == 0 || ecyl == 0) - goto out; - if (p[8] == p[12] && /* dp_ssect == dp_esect */ - p[9] == p[13] && /* dp_shd == dp_ehd */ - scyl == ecyl) - goto out; - } - - res = G_PART_PROBE_PRI_HIGH; - - out: - g_free(buf); - return (res); -} - -static int -g_part_pc98_read(struct g_part_table *basetable, struct g_consumer *cp) -{ - struct pc98_partition ent; - struct g_provider *pp; - struct g_part_pc98_table *table; - struct g_part_pc98_entry *entry; - u_char *buf, *p; - off_t msize; - off_t start, end; - u_int cyl; - int error, index; - - pp = cp->provider; - table = (struct g_part_pc98_table *)basetable; - msize = MIN(pp->mediasize / SECSIZE, UINT32_MAX); - - buf = g_read_data(cp, 0L, BOOTSIZE, &error); - if (buf == NULL) - return (error); - - cyl = basetable->gpt_heads * basetable->gpt_sectors; - - bcopy(buf, table->boot, sizeof(table->boot)); - bcopy(buf + SECSIZE, table->table, sizeof(table->table)); - bcopy(buf + SECSIZE*2, table->menu, sizeof(table->menu)); - - for (index = PC98_NPARTS - 1; index >= 0; index--) { - p = buf + SECSIZE + index * PC98_PARTSIZE; - ent.dp_mid = p[0]; - ent.dp_sid = p[1]; - ent.dp_dum1 = p[2]; - ent.dp_dum2 = p[3]; - ent.dp_ipl_sct = p[4]; - ent.dp_ipl_head = p[5]; - ent.dp_ipl_cyl = le16dec(p + 6); - ent.dp_ssect = p[8]; - ent.dp_shd = p[9]; - ent.dp_scyl = le16dec(p + 10); - ent.dp_esect = p[12]; - ent.dp_ehd = p[13]; - ent.dp_ecyl = le16dec(p + 14); - bcopy(p + 16, ent.dp_name, sizeof(ent.dp_name)); - if (ent.dp_sid == 0) - continue; - - start = ent.dp_scyl * cyl; - end = (ent.dp_ecyl + 1) * cyl - 1; - entry = (struct g_part_pc98_entry *)g_part_new_entry(basetable, - index + 1, start, end); - entry->ent = ent; - } - - basetable->gpt_entries = PC98_NPARTS; - basetable->gpt_first = cyl; - basetable->gpt_last = msize - 1; - - g_free(buf); - return (0); -} - -static int -g_part_pc98_setunset(struct g_part_table *table, struct g_part_entry *baseentry, - const char *attrib, unsigned int set) -{ - struct g_part_entry *iter; - struct g_part_pc98_entry *entry; - int changed, mid, sid; - - if (baseentry == NULL) - return (ENODEV); - - mid = sid = 0; - if (strcasecmp(attrib, "active") == 0) - sid = 1; - else if (strcasecmp(attrib, "bootable") == 0) - mid = 1; - if (mid == 0 && sid == 0) - return (EINVAL); - - LIST_FOREACH(iter, &table->gpt_entry, gpe_entry) { - if (iter->gpe_deleted) - continue; - if (iter != baseentry) - continue; - changed = 0; - entry = (struct g_part_pc98_entry *)iter; - if (set) { - if (mid && !(entry->ent.dp_mid & PC98_MID_BOOTABLE)) { - entry->ent.dp_mid |= PC98_MID_BOOTABLE; - changed = 1; - } - if (sid && !(entry->ent.dp_sid & PC98_SID_ACTIVE)) { - entry->ent.dp_sid |= PC98_SID_ACTIVE; - changed = 1; - } - } else { - if (mid && (entry->ent.dp_mid & PC98_MID_BOOTABLE)) { - entry->ent.dp_mid &= ~PC98_MID_BOOTABLE; - changed = 1; - } - if (sid && (entry->ent.dp_sid & PC98_SID_ACTIVE)) { - entry->ent.dp_sid &= ~PC98_SID_ACTIVE; - changed = 1; - } - } - if (changed && !iter->gpe_created) - iter->gpe_modified = 1; - } - return (0); -} - -static const char * -g_part_pc98_type(struct g_part_table *basetable, struct g_part_entry *baseentry, - char *buf, size_t bufsz) -{ - struct g_part_pc98_entry *entry; - u_int type; - - entry = (struct g_part_pc98_entry *)baseentry; - type = (entry->ent.dp_mid & PC98_MID_MASK) | - ((entry->ent.dp_sid & PC98_SID_MASK) << 8); - if (type == (PC98_MID_386BSD | (PC98_SID_386BSD << 8))) - return (g_part_alias_name(G_PART_ALIAS_FREEBSD)); - snprintf(buf, bufsz, "!%d", type); - return (buf); -} - -static int -g_part_pc98_write(struct g_part_table *basetable, struct g_consumer *cp) -{ - struct g_part_entry *baseentry; - struct g_part_pc98_entry *entry; - struct g_part_pc98_table *table; - u_char *p; - int error, index; - - table = (struct g_part_pc98_table *)basetable; - baseentry = LIST_FIRST(&basetable->gpt_entry); - for (index = 1; index <= basetable->gpt_entries; index++) { - p = table->table + (index - 1) * PC98_PARTSIZE; - entry = (baseentry != NULL && index == baseentry->gpe_index) - ? (struct g_part_pc98_entry *)baseentry : NULL; - if (entry != NULL && !baseentry->gpe_deleted) { - p[0] = entry->ent.dp_mid; - p[1] = entry->ent.dp_sid; - p[2] = entry->ent.dp_dum1; - p[3] = entry->ent.dp_dum2; - p[4] = entry->ent.dp_ipl_sct; - p[5] = entry->ent.dp_ipl_head; - le16enc(p + 6, entry->ent.dp_ipl_cyl); - p[8] = entry->ent.dp_ssect; - p[9] = entry->ent.dp_shd; - le16enc(p + 10, entry->ent.dp_scyl); - p[12] = entry->ent.dp_esect; - p[13] = entry->ent.dp_ehd; - le16enc(p + 14, entry->ent.dp_ecyl); - bcopy(entry->ent.dp_name, p + 16, - sizeof(entry->ent.dp_name)); - } else - bzero(p, PC98_PARTSIZE); - - if (entry != NULL) - baseentry = LIST_NEXT(baseentry, gpe_entry); - } - - error = g_write_data(cp, 0, table->boot, SECSIZE); - if (!error) - error = g_write_data(cp, SECSIZE, table->table, SECSIZE); - if (!error) - error = g_write_data(cp, SECSIZE*2, table->menu, MENUSIZE); - return (error); -} diff --git a/sys/i386/bios/apm.c b/sys/i386/bios/apm.c index a4d3bd79ee39..a38ab16bbc56 100644 --- a/sys/i386/bios/apm.c +++ b/sys/i386/bios/apm.c @@ -82,19 +82,6 @@ int apm_evindex; #define APMDEV_NORMAL 0 #define APMDEV_CTL 1 -#ifdef PC98 -extern int bios32_apm98(struct bios_regs *, u_int, u_short); - -/* PC98's SMM definition */ -#define APM_NECSMM_PORT 0x6b8e -#define APM_NECSMM_PORTSZ 1 -#define APM_NECSMM_EN 0x10 -static __inline void apm_enable_smm(struct apm_softc *); -static __inline void apm_disable_smm(struct apm_softc *); -int apm_necsmm_addr; -u_int32_t apm_necsmm_mask; -#endif - static struct apmhook *hook[NAPM_HOOK]; /* XXX */ #define is_enabled(foo) ((foo) ? "enabled" : "disabled") @@ -137,30 +124,6 @@ SYSCTL_INT(_debug, OID_AUTO, apm_debug, CTLFLAG_RW, &apm_debug, 0, ""); SYSCTL_INT(_machdep, OID_AUTO, apm_swab_batt_minutes, CTLFLAG_RWTUN, &apm_swab_batt_minutes, 0, "Byte swap battery time value."); -#ifdef PC98 -static __inline void -apm_enable_smm(sc) - struct apm_softc *sc; -{ - bus_space_tag_t iot = sc->sc_iot; - bus_space_handle_t ioh = sc->sc_ioh; - if (apm_necsmm_addr != 0) - bus_space_write_1(iot, ioh, 0, - (bus_space_read_1(iot, ioh, 0) | ~apm_necsmm_mask)); -} - -static __inline void -apm_disable_smm(sc) - struct apm_softc *sc; -{ - bus_space_tag_t iot = sc->sc_iot; - bus_space_handle_t ioh = sc->sc_ioh; - if (apm_necsmm_addr != 0) - bus_space_write_1(iot, ioh, 0, - (bus_space_read_1(iot, ioh, 0) & apm_necsmm_mask)); -} -#endif - /* * return 0 if the function successfull, * return 1 if the function unsuccessfull, @@ -180,12 +143,6 @@ apm_bioscall(void) } sc->bios_busy = 1; -#ifdef PC98 - set_bios_selectors(&sc->bios.seg, BIOSCODE_FLAG | BIOSDATA_FLAG); - if (bios32_apm98(&sc->bios.r, sc->bios.entry, - GSEL(GBIOSCODE32_SEL, SEL_KPL)) != 0) - return 1; -#else if (sc->connectmode == APM_PROT32CONNECT) { set_bios_selectors(&sc->bios.seg, BIOSCODE_FLAG | BIOSDATA_FLAG); @@ -194,7 +151,6 @@ apm_bioscall(void) } else { errno = bios16(&sc->bios, NULL); } -#endif sc->bios_busy = 0; return (errno); } @@ -207,11 +163,6 @@ apm_check_function_supported(u_int version, u_int func) if (func == APM_DRVVERSION) { return (1); } -#ifdef PC98 - if (func == APM_GETPWSTATUS) { - return (1); - } -#endif switch (version) { case INTVERSION(1, 0): @@ -310,17 +261,12 @@ apm_suspend_system(int state) sc->bios.r.ecx = state; sc->bios.r.edx = 0; -#ifdef PC98 - apm_disable_smm(sc); -#endif if (apm_bioscall()) { printf("Entire system suspend failure: errcode = %d\n", 0xff & (sc->bios.r.eax >> 8)); return 1; } -#ifdef PC98 - apm_enable_smm(sc); -#endif + return 0; } @@ -894,9 +840,6 @@ apm_probe(device_t dev) #define APM_KERNBASE KERNBASE struct vm86frame vmf; struct apm_softc *sc = &apm_softc; -#ifdef PC98 - int rid; -#endif device_set_desc(dev, "APM BIOS"); if (device_get_unit(dev) > 0) { @@ -936,38 +879,6 @@ apm_probe(device_t dev) vmf.vmf_bx = 0; vm86_intcall(APM_INT, &vmf); /* disconnect, just in case */ -#ifdef PC98 - /* PC98 have bogos APM 32bit BIOS */ - if ((vmf.vmf_cx & APM_32BIT_SUPPORT) == 0) - return ENXIO; - rid = 0; - bus_set_resource(dev, SYS_RES_IOPORT, rid, - APM_NECSMM_PORT, APM_NECSMM_PORTSZ); - sc->sc_res = bus_alloc_resource(dev, SYS_RES_IOPORT, &rid, - APM_NECSMM_PORT, ~0, APM_NECSMM_PORTSZ, RF_ACTIVE); - if (sc->sc_res == NULL) { - printf("apm: cannot open NEC smm device\n"); - return ENXIO; - } - bus_release_resource(dev, SYS_RES_IOPORT, rid, sc->sc_res); - - vmf.vmf_ah = APM_BIOS; - vmf.vmf_al = APM_PROT32CONNECT; - vmf.vmf_bx = 0; - if (vm86_intcall(APM_INT, &vmf)) { - printf("apm: 32-bit connection error.\n"); - return (ENXIO); - } - - sc->bios.seg.code32.base = (vmf.vmf_ax << 4) + APM_KERNBASE; - sc->bios.seg.code32.limit = 0xffff; - sc->bios.seg.code16.base = (vmf.vmf_cx << 4) + APM_KERNBASE; - sc->bios.seg.code16.limit = 0xffff; - sc->bios.seg.data.base = (vmf.vmf_dx << 4) + APM_KERNBASE; - sc->bios.seg.data.limit = 0xffff; - sc->bios.entry = vmf.vmf_ebx; - sc->connectmode = APM_PROT32CONNECT; -#else if ((vmf.vmf_cx & APM_32BIT_SUPPORT) != 0) { vmf.vmf_ah = APM_BIOS; vmf.vmf_al = APM_PROT32CONNECT; @@ -1000,7 +911,7 @@ apm_probe(device_t dev) sc->bios.entry = vmf.vmf_bx; sc->connectmode = APM_PROT16CONNECT; } -#endif + return(0); } @@ -1134,9 +1045,6 @@ apm_processevent(void) break; } } while (apm_event != PMEV_NOEVENT); -#ifdef PC98 - apm_disable_smm(sc); -#endif } /* @@ -1150,16 +1058,12 @@ apm_attach(device_t dev) { struct apm_softc *sc = &apm_softc; int drv_version; -#ifdef PC98 - int rid; -#endif + mtx_init(&sc->mtx, device_get_nameunit(dev), "apm", MTX_DEF); cv_init(&sc->cv, "cbb cv"); -#ifndef PC98 if (device_get_flags(dev) & 0x20) atrtcclock_disable = 1; -#endif sc->initialized = 0; @@ -1181,22 +1085,6 @@ apm_attach(device_t dev) APM_DPRINT("apm: CS_limit=0x%x, DS_limit=0x%x\n", sc->bios.seg.code16.limit, sc->bios.seg.data.limit); -#ifdef PC98 - rid = 0; - sc->sc_res = bus_alloc_resource(dev, SYS_RES_IOPORT, &rid, - APM_NECSMM_PORT, ~0, APM_NECSMM_PORTSZ, RF_ACTIVE); - if (sc->sc_res == NULL) - panic("%s: counldn't map I/O ports", device_get_name(dev)); - sc->sc_iot = rman_get_bustag(sc->sc_res); - sc->sc_ioh = rman_get_bushandle(sc->sc_res); - - if (apm_version==0x112 || apm_version==0x111 || apm_version==0x110) - apm_necsmm_addr = APM_NECSMM_PORT; - else - apm_necsmm_addr = 0; - apm_necsmm_mask = ~APM_NECSMM_EN; -#endif /* PC98 */ - /* * In one test, apm bios version was 1.02; an attempt to register * a 1.04 driver resulted in a 1.00 connection! Registering a @@ -1391,23 +1279,6 @@ apmioctl(struct cdev *dev, u_long cmd, caddr_t addr, int flag, struct thread *td return (EPERM); /* XXX compatibility with the old interface */ args = (struct apm_bios_arg *)addr; -#ifdef PC98 - if (((args->eax >> 8) & 0xff) == 0x53) { - sc->bios.r.eax = args->eax & ~0xffff; - sc->bios.r.eax |= APM_BIOS << 8; - switch (args->eax & 0xff) { - case 0x0a: - sc->bios.r.eax |= APM_GETPWSTATUS; - break; - case 0x0e: - sc->bios.r.eax |= APM_DRVVERSION; - break; - default: - sc->bios.r.eax |= args->eax & 0xff; - break; - } - } else -#endif sc->bios.r.eax = args->eax; sc->bios.r.ebx = args->ebx; sc->bios.r.ecx = args->ecx; diff --git a/sys/i386/bios/apm.h b/sys/i386/bios/apm.h index 03c4470ba340..70cb15a5bdad 100644 --- a/sys/i386/bios/apm.h +++ b/sys/i386/bios/apm.h @@ -27,11 +27,6 @@ /* static data */ struct apm_softc { -#ifdef PC98 - bus_space_tag_t sc_iot; - bus_space_handle_t sc_ioh; - struct resource *sc_res; -#endif struct mtx mtx; struct cv cv; struct proc *event_thread; diff --git a/sys/i386/i386/genassym.c b/sys/i386/i386/genassym.c index a0e4d242cfa2..60482c9d5948 100644 --- a/sys/i386/i386/genassym.c +++ b/sys/i386/i386/genassym.c @@ -229,13 +229,6 @@ ASSYM(BC32SEL, GSEL(GBIOSCODE32_SEL, SEL_KPL)); ASSYM(GPROC0_SEL, GPROC0_SEL); ASSYM(VM86_FRAMESIZE, sizeof(struct vm86frame)); -#ifdef PC98 -#include <machine/bus.h> - -ASSYM(BUS_SPACE_HANDLE_BASE, offsetof(struct bus_space_handle, bsh_base)); -ASSYM(BUS_SPACE_HANDLE_IAT, offsetof(struct bus_space_handle, bsh_iat)); -#endif - #ifdef HWPMC_HOOKS ASSYM(PMC_FN_USER_CALLCHAIN, PMC_FN_USER_CALLCHAIN); #endif diff --git a/sys/i386/i386/initcpu.c b/sys/i386/i386/initcpu.c index f67593794908..6b1f8639ad41 100644 --- a/sys/i386/i386/initcpu.c +++ b/sys/i386/i386/initcpu.c @@ -92,10 +92,6 @@ init_bluelightning(void) { register_t saveintr; -#if defined(PC98) && !defined(CPU_UPGRADE_HW_CACHE) - need_post_dma_flush = 1; -#endif - saveintr = intr_disable(); load_cr0(rcr0() | CR0_CD | CR0_NW); @@ -182,14 +178,6 @@ init_cy486dx(void) ccr2 |= CCR2_SUSP_HLT; #endif -#ifdef PC98 - /* Enables WB cache interface pin and Lock NW bit in CR0. */ - ccr2 |= CCR2_WB | CCR2_LOCK_NW; - /* Unlock NW bit in CR0. */ - write_cyrix_reg(CCR2, ccr2 & ~CCR2_LOCK_NW); - load_cr0((rcr0() & ~CR0_CD) | CR0_NW); /* CD = 0, NW = 1 */ -#endif - write_cyrix_reg(CCR2, ccr2); intr_restore(saveintr); } @@ -303,10 +291,6 @@ init_i486_on_386(void) { register_t saveintr; -#if defined(PC98) && !defined(CPU_UPGRADE_HW_CACHE) - need_post_dma_flush = 1; -#endif - saveintr = intr_disable(); load_cr0(rcr0() & ~(CR0_CD | CR0_NW)); /* CD = 0, NW = 0 */ @@ -806,52 +790,6 @@ initializecpucache(void) cpu_feature &= ~CPUID_CLFSH; cpu_stdext_feature &= ~CPUID_STDEXT_CLFLUSHOPT; } - -#if defined(PC98) && !defined(CPU_UPGRADE_HW_CACHE) - /* - * OS should flush L1 cache by itself because no PC-98 supports - * non-Intel CPUs. Use wbinvd instruction before DMA transfer - * when need_pre_dma_flush = 1, use invd instruction after DMA - * transfer when need_post_dma_flush = 1. If your CPU upgrade - * product supports hardware cache control, you can add the - * CPU_UPGRADE_HW_CACHE option in your kernel configuration file. - * This option eliminates unneeded cache flush instruction(s). - */ - if (cpu_vendor_id == CPU_VENDOR_CYRIX) { - switch (cpu) { -#ifdef I486_CPU - case CPU_486DLC: - need_post_dma_flush = 1; - break; - case CPU_M1SC: - need_pre_dma_flush = 1; - break; - case CPU_CY486DX: - need_pre_dma_flush = 1; -#ifdef CPU_I486_ON_386 - need_post_dma_flush = 1; -#endif - break; -#endif - default: - break; - } - } else if (cpu_vendor_id == CPU_VENDOR_AMD) { - switch (cpu_id & 0xFF0) { - case 0x470: /* Enhanced Am486DX2 WB */ - case 0x490: /* Enhanced Am486DX4 WB */ - case 0x4F0: /* Am5x86 WB */ - need_pre_dma_flush = 1; - break; - } - } else if (cpu_vendor_id == CPU_VENDOR_IBM) { - need_post_dma_flush = 1; - } else { -#ifdef CPU_I486_ON_386 - need_pre_dma_flush = 1; -#endif - } -#endif /* PC98 && !CPU_UPGRADE_HW_CACHE */ } #if defined(I586_CPU) && defined(CPU_WT_ALLOC) @@ -884,19 +822,13 @@ enable_K5_wt_alloc(void) else msr = 0; msr |= AMD_WT_ALLOC_TME | AMD_WT_ALLOC_FRE; -#ifdef PC98 - if (!(inb(0x43b) & 4)) { - wrmsr(0x86, 0x0ff00f0); - msr |= AMD_WT_ALLOC_PRE; - } -#else + /* * There is no way to know wheter 15-16M hole exists or not. * Therefore, we disable write allocate for this range. */ - wrmsr(0x86, 0x0ff00f0); - msr |= AMD_WT_ALLOC_PRE; -#endif + wrmsr(0x86, 0x0ff00f0); + msr |= AMD_WT_ALLOC_PRE; wrmsr(0x85, msr); msr=rdmsr(0x83); @@ -940,19 +872,9 @@ enable_K6_wt_alloc(void) size = 0x7f; whcr = (rdmsr(0xc0000082) & ~(0x7fLL << 1)) | (size << 1); -#if defined(PC98) || defined(NO_MEMORY_HOLE) - if (whcr & (0x7fLL << 1)) { -#ifdef PC98 - /* - * If bit 2 of port 0x43b is 0, disable wrte allocate for the - * 15-16M range. - */ - if (!(inb(0x43b) & 4)) - whcr &= ~0x0001LL; - else -#endif - whcr |= 0x0001LL; - } +#if defined(NO_MEMORY_HOLE) + if (whcr & (0x7fLL << 1)) + whcr |= 0x0001LL; #else /* * There is no way to know wheter 15-16M hole exists or not. @@ -1000,19 +922,9 @@ enable_K6_2_wt_alloc(void) size = 0x3ff; whcr = (rdmsr(0xc0000082) & ~(0x3ffLL << 22)) | (size << 22); -#if defined(PC98) || defined(NO_MEMORY_HOLE) - if (whcr & (0x3ffLL << 22)) { -#ifdef PC98 - /* - * If bit 2 of port 0x43b is 0, disable wrte allocate for the - * 15-16M range. - */ - if (!(inb(0x43b) & 4)) - whcr &= ~(1LL << 16); - else -#endif - whcr |= 1LL << 16; - } +#if defined(NO_MEMORY_HOLE) + if (whcr & (0x3ffLL << 22)) + whcr |= 1LL << 16; #else /* * There is no way to know wheter 15-16M hole exists or not. diff --git a/sys/i386/i386/locore.s b/sys/i386/i386/locore.s index 4d8e22fc3002..f41a77c45ff6 100644 --- a/sys/i386/i386/locore.s +++ b/sys/i386/i386/locore.s @@ -120,12 +120,6 @@ vm86phystk: .long 0 /* PA of vm86/bios stack */ vm86paddr: .long 0 /* address of vm86 region */ vm86pa: .long 0 /* phys addr of vm86 region */ -#ifdef PC98 - .globl pc98_system_parameter -pc98_system_parameter: - .space 0x240 -#endif - /********************************************************************** * * Some handy macros @@ -183,18 +177,8 @@ pc98_system_parameter: */ NON_GPROF_ENTRY(btext) -#ifdef PC98 - /* save SYSTEM PARAMETER for resume (NS/T or other) */ - movl $0xa1400,%esi - movl $R(pc98_system_parameter),%edi - movl $0x0240,%ecx - cld - rep - movsb -#else /* IBM-PC */ /* Tell the bios to warmboot next time */ movw $0x1234,0x472 -#endif /* PC98 */ /* Set up a real frame in case the double return in newboot is executed. */ pushl %ebp @@ -240,33 +224,6 @@ NON_GPROF_ENTRY(btext) */ movl $R(tmpstk),%esp -#ifdef PC98 - /* pc98_machine_type & M_EPSON_PC98 */ - testb $0x02,R(pc98_system_parameter)+220 - jz 3f - /* epson_machine_id <= 0x0b */ - cmpb $0x0b,R(pc98_system_parameter)+224 - ja 3f - - /* count up memory */ - movl $0x100000,%eax /* next, talley remaining memory */ - movl $0xFFF-0x100,%ecx -1: movl 0(%eax),%ebx /* save location to check */ - movl $0xa55a5aa5,0(%eax) /* write test pattern */ - cmpl $0xa55a5aa5,0(%eax) /* does not check yet for rollover */ - jne 2f - movl %ebx,0(%eax) /* restore memory */ - addl $PAGE_SIZE,%eax - loop 1b -2: subl $0x100000,%eax - shrl $17,%eax - movb %al,R(pc98_system_parameter)+1 -3: - - movw R(pc98_system_parameter+0x86),%ax - movw %ax,R(cpu_id) -#endif - call identify_cpu call create_pagetables diff --git a/sys/i386/i386/machdep.c b/sys/i386/i386/machdep.c index 9200d00401f5..855386bf0931 100644 --- a/sys/i386/i386/machdep.c +++ b/sys/i386/i386/machdep.c @@ -109,11 +109,7 @@ __FBSDID("$FreeBSD$"); #include <ddb/db_sym.h> #endif -#ifdef PC98 -#include <pc98/pc98/pc98_machdep.h> -#else #include <isa/rtc.h> -#endif #include <net/netisr.h> @@ -185,14 +181,6 @@ SYSINIT(cpu, SI_SUB_CPU, SI_ORDER_FIRST, cpu_startup, NULL); int _udatasel, _ucodesel; u_int basemem; -#ifdef PC98 -int need_pre_dma_flush; /* If 1, use wbinvd befor DMA transfer. */ -int need_post_dma_flush; /* If 1, use invd after DMA transfer. */ - -static int ispc98 = 1; -SYSCTL_INT(_machdep, OID_AUTO, ispc98, CTLFLAG_RD, &ispc98, 0, ""); -#endif - int cold = 1; #ifdef COMPAT_43 @@ -249,7 +237,6 @@ cpu_startup(dummy) uintmax_t memsize; char *sysenv; -#ifndef PC98 /* * On MacBooks, we need to disallow the legacy USB circuit to * generate an SMI# because this can cause several problems, @@ -275,7 +262,6 @@ cpu_startup(dummy) } freeenv(sysenv); } -#endif /* !PC98 */ /* * Good {morning,afternoon,evening,night}. @@ -1618,7 +1604,6 @@ sdtossd(sd, ssd) ssd->ssd_gran = sd->sd_gran; } -#if !defined(PC98) static int add_physmap_entry(uint64_t base, uint64_t length, vm_paddr_t *physmap, int *physmap_idxp) @@ -1725,7 +1710,6 @@ add_smap_entries(struct bios_smap *smapbase, vm_paddr_t *physmap, if (!add_smap_entry(smap, physmap, physmap_idxp)) break; } -#endif /* !PC98 */ static void basemem_setup(void) @@ -1788,269 +1772,6 @@ basemem_setup(void) * * XXX first should be vm_paddr_t. */ -#ifdef PC98 -static void -getmemsize(int first) -{ - int off, physmap_idx, pa_indx, da_indx; - u_long physmem_tunable, memtest; - vm_paddr_t physmap[PHYSMAP_SIZE]; - pt_entry_t *pte; - quad_t dcons_addr, dcons_size; - int i; - int pg_n; - u_int extmem; - u_int under16; - vm_paddr_t pa; - - bzero(physmap, sizeof(physmap)); - - /* XXX - some of EPSON machines can't use PG_N */ - pg_n = PG_N; - if (pc98_machine_type & M_EPSON_PC98) { - switch (epson_machine_id) { -#ifdef WB_CACHE - default: -#endif - case EPSON_PC486_HX: - case EPSON_PC486_HG: - case EPSON_PC486_HA: - pg_n = 0; - break; - } - } - - under16 = pc98_getmemsize(&basemem, &extmem); - basemem_setup(); - - physmap[0] = 0; - physmap[1] = basemem * 1024; - physmap_idx = 2; - physmap[physmap_idx] = 0x100000; - physmap[physmap_idx + 1] = physmap[physmap_idx] + extmem * 1024; - - /* - * Now, physmap contains a map of physical memory. - */ - -#ifdef SMP - /* make hole for AP bootstrap code */ - physmap[1] = mp_bootaddress(physmap[1]); -#endif - - /* - * Maxmem isn't the "maximum memory", it's one larger than the - * highest page of the physical address space. It should be - * called something like "Maxphyspage". We may adjust this - * based on ``hw.physmem'' and the results of the memory test. - */ - Maxmem = atop(physmap[physmap_idx + 1]); - -#ifdef MAXMEM - Maxmem = MAXMEM / 4; -#endif - - if (TUNABLE_ULONG_FETCH("hw.physmem", &physmem_tunable)) - Maxmem = atop(physmem_tunable); - - /* - * By default keep the memtest enabled. Use a general name so that - * one could eventually do more with the code than just disable it. - */ - memtest = 1; - TUNABLE_ULONG_FETCH("hw.memtest.tests", &memtest); - - if (atop(physmap[physmap_idx + 1]) != Maxmem && - (boothowto & RB_VERBOSE)) - printf("Physical memory use set to %ldK\n", Maxmem * 4); - - /* - * If Maxmem has been increased beyond what the system has detected, - * extend the last memory segment to the new limit. - */ - if (atop(physmap[physmap_idx + 1]) < Maxmem) - physmap[physmap_idx + 1] = ptoa((vm_paddr_t)Maxmem); - - /* - * We need to divide chunk if Maxmem is larger than 16MB and - * under 16MB area is not full of memory. - * (1) system area (15-16MB region) is cut off - * (2) extended memory is only over 16MB area (ex. Melco "HYPERMEMORY") - */ - if ((under16 != 16 * 1024) && (extmem > 15 * 1024)) { - /* 15M - 16M region is cut off, so need to divide chunk */ - physmap[physmap_idx + 1] = under16 * 1024; - physmap_idx += 2; - physmap[physmap_idx] = 0x1000000; - physmap[physmap_idx + 1] = physmap[2] + extmem * 1024; - } - - /* call pmap initialization to make new kernel address space */ - pmap_bootstrap(first); - - /* - * Size up each available chunk of physical memory. - */ - physmap[0] = PAGE_SIZE; /* mask off page 0 */ - pa_indx = 0; - da_indx = 1; - phys_avail[pa_indx++] = physmap[0]; - phys_avail[pa_indx] = physmap[0]; - dump_avail[da_indx] = physmap[0]; - pte = CMAP3; - - /* - * Get dcons buffer address - */ - if (getenv_quad("dcons.addr", &dcons_addr) == 0 || - getenv_quad("dcons.size", &dcons_size) == 0) - dcons_addr = 0; - - /* - * physmap is in bytes, so when converting to page boundaries, - * round up the start address and round down the end address. - */ - for (i = 0; i <= physmap_idx; i += 2) { - vm_paddr_t end; - - end = ptoa((vm_paddr_t)Maxmem); - if (physmap[i + 1] < end) - end = trunc_page(physmap[i + 1]); - for (pa = round_page(physmap[i]); pa < end; pa += PAGE_SIZE) { - int tmp, page_bad, full; - int *ptr = (int *)CADDR3; - - full = FALSE; - /* - * block out kernel memory as not available. - */ - if (pa >= KERNLOAD && pa < first) - goto do_dump_avail; - - /* - * block out dcons buffer - */ - if (dcons_addr > 0 - && pa >= trunc_page(dcons_addr) - && pa < dcons_addr + dcons_size) - goto do_dump_avail; - - page_bad = FALSE; - if (memtest == 0) - goto skip_memtest; - - /* - * map page into kernel: valid, read/write,non-cacheable - */ - *pte = pa | PG_V | PG_RW | pg_n; - invltlb(); - - tmp = *(int *)ptr; - /* - * Test for alternating 1's and 0's - */ - *(volatile int *)ptr = 0xaaaaaaaa; - if (*(volatile int *)ptr != 0xaaaaaaaa) - page_bad = TRUE; - /* - * Test for alternating 0's and 1's - */ - *(volatile int *)ptr = 0x55555555; - if (*(volatile int *)ptr != 0x55555555) - page_bad = TRUE; - /* - * Test for all 1's - */ - *(volatile int *)ptr = 0xffffffff; - if (*(volatile int *)ptr != 0xffffffff) - page_bad = TRUE; - /* - * Test for all 0's - */ - *(volatile int *)ptr = 0x0; - if (*(volatile int *)ptr != 0x0) - page_bad = TRUE; - /* - * Restore original value. - */ - *(int *)ptr = tmp; - -skip_memtest: - /* - * Adjust array of valid/good pages. - */ - if (page_bad == TRUE) - continue; - /* - * If this good page is a continuation of the - * previous set of good pages, then just increase - * the end pointer. Otherwise start a new chunk. - * Note that "end" points one higher than end, - * making the range >= start and < end. - * If we're also doing a speculative memory - * test and we at or past the end, bump up Maxmem - * so that we keep going. The first bad page - * will terminate the loop. - */ - if (phys_avail[pa_indx] == pa) { - phys_avail[pa_indx] += PAGE_SIZE; - } else { - pa_indx++; - if (pa_indx == PHYS_AVAIL_ARRAY_END) { - printf( - "Too many holes in the physical address space, giving up\n"); - pa_indx--; - full = TRUE; - goto do_dump_avail; - } - phys_avail[pa_indx++] = pa; /* start */ - phys_avail[pa_indx] = pa + PAGE_SIZE; /* end */ - } - physmem++; -do_dump_avail: - if (dump_avail[da_indx] == pa) { - dump_avail[da_indx] += PAGE_SIZE; - } else { - da_indx++; - if (da_indx == DUMP_AVAIL_ARRAY_END) { - da_indx--; - goto do_next; - } - dump_avail[da_indx++] = pa; /* start */ - dump_avail[da_indx] = pa + PAGE_SIZE; /* end */ - } -do_next: - if (full) - break; - } - } - *pte = 0; - invltlb(); - - /* - * XXX - * The last chunk must contain at least one page plus the message - * buffer to avoid complicating other code (message buffer address - * calculation, etc.). - */ - while (phys_avail[pa_indx - 1] + PAGE_SIZE + - round_page(msgbufsize) >= phys_avail[pa_indx]) { - physmem -= atop(phys_avail[pa_indx] - phys_avail[pa_indx - 1]); - phys_avail[pa_indx--] = 0; - phys_avail[pa_indx--] = 0; - } - - Maxmem = atop(phys_avail[pa_indx]); - - /* Trim off space for the message buffer. */ - phys_avail[pa_indx] -= round_page(msgbufsize); - - /* Map the message buffer. */ - for (off = 0; off < round_page(msgbufsize); off += PAGE_SIZE) - pmap_kenter((vm_offset_t)msgbufp + off, phys_avail[pa_indx] + - off); -} -#else /* PC98 */ static void getmemsize(int first) { @@ -2428,7 +2149,6 @@ do_next: pmap_kenter((vm_offset_t)msgbufp + off, phys_avail[pa_indx] + off); } -#endif /* PC98 */ static void i386_kdb_init(void) @@ -2464,13 +2184,6 @@ init386(first) */ proc_linkup0(&proc0, &thread0); -#ifdef PC98 - /* - * Initialize DMAC - */ - pc98_init_dmac(); -#endif - metadata_missing = 0; if (bootinfo.bi_modulep) { preload_metadata = (caddr_t)bootinfo.bi_modulep + KERNBASE; @@ -2666,9 +2379,7 @@ init386(first) /* Initialize the PIC early for vm86 calls. */ #ifdef DEV_ISA #ifdef DEV_ATPIC -#ifndef PC98 elcr_probe(); -#endif atpic_startup(); #else /* Reset and mask the atpics and leave them shut down. */ @@ -2787,7 +2498,6 @@ cpu_pcpu_init(struct pcpu *pcpu, int cpuid, size_t size) pcpu->pc_acpi_id = 0xffffffff; } -#ifndef PC98 static int smap_sysctl_handler(SYSCTL_HANDLER_ARGS) { @@ -2823,7 +2533,6 @@ smap_sysctl_handler(SYSCTL_HANDLER_ARGS) } SYSCTL_PROC(_machdep, OID_AUTO, smap, CTLTYPE_OPAQUE|CTLFLAG_RD, NULL, 0, smap_sysctl_handler, "S,bios_smap_xattr", "Raw BIOS SMAP data"); -#endif /* !PC98 */ void spinlock_enter(void) diff --git a/sys/i386/i386/mp_machdep.c b/sys/i386/i386/mp_machdep.c index c2c200a09b64..fcb787dc196f 100644 --- a/sys/i386/i386/mp_machdep.c +++ b/sys/i386/i386/mp_machdep.c @@ -100,7 +100,7 @@ __FBSDID("$FreeBSD$"); #define CHECK_POINTS */ -#if defined(CHECK_POINTS) && !defined(PC98) +#if defined(CHECK_POINTS) #define CHECK_READ(A) (outb(CMOS_REG, (A)), inb(CMOS_DATA)) #define CHECK_WRITE(A,D) (outb(CMOS_REG, (A)), outb(CMOS_DATA, (D))) @@ -309,9 +309,7 @@ init_secondary(void) static int start_all_aps(void) { -#ifndef PC98 u_char mpbiosreason; -#endif u_int32_t mpbioswarmvec; int apic_id, cpu, i; @@ -322,10 +320,8 @@ start_all_aps(void) /* save the current value of the warm-start vector */ mpbioswarmvec = *((u_int32_t *) WARMBOOT_OFF); -#ifndef PC98 outb(CMOS_REG, BIOS_RESET); mpbiosreason = inb(CMOS_DATA); -#endif /* set up temporary P==V mapping for AP boot */ /* XXX this is a hack, we should boot the AP on its own stack/PTD */ @@ -346,10 +342,8 @@ start_all_aps(void) /* setup a vector to our boot code */ *((volatile u_short *) WARMBOOT_OFF) = WARMBOOT_TARGET; *((volatile u_short *) WARMBOOT_SEG) = (boot_address >> 4); -#ifndef PC98 outb(CMOS_REG, BIOS_RESET); outb(CMOS_DATA, BIOS_WARM); /* 'warm-start' */ -#endif bootSTK = (char *)bootstacks[cpu] + kstack_pages * PAGE_SIZE - 4; @@ -373,10 +367,8 @@ start_all_aps(void) /* restore the warmstart vector */ *(u_int32_t *) WARMBOOT_OFF = mpbioswarmvec; -#ifndef PC98 outb(CMOS_REG, BIOS_RESET); outb(CMOS_DATA, mpbiosreason); -#endif /* Undo V==P hack from above */ for (i = TMPMAP_START; i < NKPT; i++) diff --git a/sys/i386/i386/mpboot.s b/sys/i386/i386/mpboot.s index 8f5098d14f81..cdbd28363708 100644 --- a/sys/i386/i386/mpboot.s +++ b/sys/i386/i386/mpboot.s @@ -47,7 +47,7 @@ #define CHECK_POINTS */ -#if defined(CHECK_POINTS) && !defined(PC98) +#if defined(CHECK_POINTS) #define CMOS_REG (0x70) #define CMOS_DATA (0x71) diff --git a/sys/i386/i386/pmap.c b/sys/i386/i386/pmap.c index 763c711ad8b3..665debeebba6 100644 --- a/sys/i386/i386/pmap.c +++ b/sys/i386/i386/pmap.c @@ -440,7 +440,7 @@ pmap_bootstrap(vm_paddr_t firstaddr) * CMAP1/CMAP2 are used for zeroing and copying pages. * CMAP3 is used for the boot-time memory test. */ - pc = pcpu_find(curcpu); + pc = get_pcpu(); mtx_init(&pc->pc_cmap_lock, "SYSMAPS", NULL, MTX_DEF); SYSMAP(caddr_t, pc->pc_cmap_pte1, pc->pc_cmap_addr1, 1) SYSMAP(caddr_t, pc->pc_cmap_pte2, pc->pc_cmap_addr2, 1) @@ -507,7 +507,14 @@ pmap_bootstrap(vm_paddr_t firstaddr) for (i = 1; i < NKPT; i++) PTD[i] = 0; - /* Initialize the PAT MSR if present. */ + /* + * Initialize the PAT MSR if present. + * pmap_init_pat() clears and sets CR4_PGE, which, as a + * side-effect, invalidates stale PG_G TLB entries that might + * have been created in our pre-boot environment. We assume + * that PAT support implies PGE and in reverse, PGE presence + * comes with PAT. Both features were added for Pentium Pro. + */ pmap_init_pat(); /* Turn on PG_G on kernel page(s) */ @@ -564,7 +571,10 @@ pmap_init_pat(void) pat_table[PAT_WRITE_PROTECTED] = 3; pat_table[PAT_UNCACHED] = 3; - /* Bail if this CPU doesn't implement PAT. */ + /* + * Bail if this CPU doesn't implement PAT. + * We assume that PAT support implies PGE. + */ if ((cpu_feature & CPUID_PAT) == 0) { for (i = 0; i < PAT_INDEX_SIZE; i++) pat_index[i] = pat_table[i]; @@ -2620,6 +2630,7 @@ pmap_demote_pde(pmap_t pmap, pd_entry_t *pde, vm_offset_t va) vm_paddr_t mptepa; vm_page_t mpte; struct spglist free; + vm_offset_t sva; PMAP_LOCK_ASSERT(pmap, MA_OWNED); oldpde = *pde; @@ -2640,8 +2651,9 @@ pmap_demote_pde(pmap_t pmap, pd_entry_t *pde, vm_offset_t va) va >> PDRSHIFT, VM_ALLOC_NOOBJ | VM_ALLOC_NORMAL | VM_ALLOC_WIRED)) == NULL) { SLIST_INIT(&free); - pmap_remove_pde(pmap, pde, trunc_4mpage(va), &free); - pmap_invalidate_page(pmap, trunc_4mpage(va)); + sva = trunc_4mpage(va); + pmap_remove_pde(pmap, pde, sva, &free); + pmap_invalidate_range(pmap, sva, sva + NBPDR - 1); pmap_free_zero_pages(&free); CTR2(KTR_PMAP, "pmap_demote_pde: failure for va %#x" " in pmap %p", va, pmap); @@ -2811,9 +2823,24 @@ pmap_remove_pde(pmap_t pmap, pd_entry_t *pdq, vm_offset_t sva, /* * Machines that don't support invlpg, also don't support * PG_G. + * + * When workaround_erratum383 is false, a promotion to a 2M/4M + * page mapping does not invalidate the 512/1024 4K page mappings + * from the TLB. Consequently, at this point, the TLB may + * hold both 4K and 2M/4M page mappings. Therefore, the entire + * range of addresses must be invalidated here. In contrast, + * when workaround_erratum383 is true, a promotion does + * invalidate the 512/1024 4K page mappings, and so a single INVLPG + * suffices to invalidate the 2M/4M page mapping. */ - if (oldpde & PG_G) - pmap_invalidate_page(kernel_pmap, sva); + if ((oldpde & PG_G) != 0) { + if (workaround_erratum383) + pmap_invalidate_page(kernel_pmap, sva); + else + pmap_invalidate_range(kernel_pmap, sva, + sva + NBPDR - 1); + } + pmap->pm_stats.resident_count -= NBPDR / PAGE_SIZE; if (oldpde & PG_MANAGED) { pvh = pa_to_pvh(oldpde & PG_PS_FRAME); @@ -3122,9 +3149,14 @@ retry: if (newpde != oldpde) { if (!pde_cmpset(pde, oldpde, newpde)) goto retry; - if (oldpde & PG_G) - pmap_invalidate_page(pmap, sva); - else + if (oldpde & PG_G) { + /* See pmap_remove_pde() for explanation. */ + if (workaround_erratum383) + pmap_invalidate_page(kernel_pmap, sva); + else + pmap_invalidate_range(kernel_pmap, sva, + sva + NBPDR - 1); + } else anychanged = TRUE; } return (anychanged); @@ -4206,7 +4238,7 @@ pmap_zero_page(vm_page_t m) struct pcpu *pc; sched_pin(); - pc = pcpu_find(curcpu); + pc = get_pcpu(); cmap_pte2 = pc->pc_cmap_pte2; mtx_lock(&pc->pc_cmap_lock); if (*cmap_pte2) @@ -4237,7 +4269,7 @@ pmap_zero_page_area(vm_page_t m, int off, int size) struct pcpu *pc; sched_pin(); - pc = pcpu_find(curcpu); + pc = get_pcpu(); cmap_pte2 = pc->pc_cmap_pte2; mtx_lock(&pc->pc_cmap_lock); if (*cmap_pte2) @@ -4264,7 +4296,7 @@ pmap_copy_page(vm_page_t src, vm_page_t dst) struct pcpu *pc; sched_pin(); - pc = pcpu_find(curcpu); + pc = get_pcpu(); cmap_pte1 = pc->pc_cmap_pte1; cmap_pte2 = pc->pc_cmap_pte2; mtx_lock(&pc->pc_cmap_lock); @@ -4299,7 +4331,7 @@ pmap_copy_pages(vm_page_t ma[], vm_offset_t a_offset, vm_page_t mb[], int cnt; sched_pin(); - pc = pcpu_find(curcpu); + pc = get_pcpu(); cmap_pte1 = pc->pc_cmap_pte1; cmap_pte2 = pc->pc_cmap_pte2; mtx_lock(&pc->pc_cmap_lock); @@ -5288,7 +5320,7 @@ pmap_flush_page(vm_page_t m) useclflushopt = (cpu_stdext_feature & CPUID_STDEXT_CLFLUSHOPT) != 0; if (useclflushopt || (cpu_feature & CPUID_CLFSH) != 0) { sched_pin(); - pc = pcpu_find(curcpu); + pc = get_pcpu(); cmap_pte2 = pc->pc_cmap_pte2; mtx_lock(&pc->pc_cmap_lock); if (*cmap_pte2) diff --git a/sys/i386/i386/vm_machdep.c b/sys/i386/i386/vm_machdep.c index b051179b7c25..2f63b5ed1f9f 100644 --- a/sys/i386/i386/vm_machdep.c +++ b/sys/i386/i386/vm_machdep.c @@ -89,11 +89,7 @@ __FBSDID("$FreeBSD$"); #include <vm/vm_map.h> #include <vm/vm_param.h> -#ifdef PC98 -#include <pc98/cbus/cbus.h> -#else #include <isa/isareg.h> -#endif #ifdef XBOX #include <machine/xbox.h> @@ -676,9 +672,7 @@ static void cpu_reset_real() { struct region_descriptor null_idt; -#ifndef PC98 int b; -#endif disable_intr(); #ifdef CPU_ELAN @@ -692,16 +686,6 @@ cpu_reset_real() outl(0xcfc, 0xf); } -#ifdef PC98 - /* - * Attempt to do a CPU reset via CPU reset port. - */ - if ((inb(0x35) & 0xa0) != 0xa0) { - outb(0x37, 0x0f); /* SHUT0 = 0. */ - outb(0x37, 0x0b); /* SHUT1 = 0. */ - } - outb(0xf0, 0x00); /* Reset. */ -#else #if !defined(BROKEN_KEYBOARD_RESET) /* * Attempt to do a CPU reset via the keyboard controller, @@ -740,7 +724,6 @@ cpu_reset_real() outb(0x92, b | 0x1); DELAY(500000); /* wait 0.5 sec to see if that did it */ } -#endif /* PC98 */ printf("No known reset method worked, attempting CPU shutdown\n"); DELAY(1000000); /* wait 1 sec for printf to complete */ diff --git a/sys/i386/include/pcpu.h b/sys/i386/include/pcpu.h index 3110f9ffe7ab..1ec6f580ea0f 100644 --- a/sys/i386/include/pcpu.h +++ b/sys/i386/include/pcpu.h @@ -76,6 +76,7 @@ extern struct pcpu *pcpup; +#define get_pcpu() (pcpup) #define PCPU_GET(member) (pcpup->pc_ ## member) #define PCPU_ADD(member, val) (pcpup->pc_ ## member += (val)) #define PCPU_INC(member) PCPU_ADD(member, 1) @@ -196,6 +197,15 @@ extern struct pcpu *pcpup; } \ } while (0) +#define get_pcpu() __extension__ ({ \ + struct pcpu *__pc; \ + \ + __asm __volatile("movl %%fs:%1,%0" \ + : "=r" (__pc) \ + : "m" (*(struct pcpu *)(__pcpu_offset(pc_prvspace)))); \ + __pc; \ +}) + #define PCPU_GET(member) __PCPU_GET(pc_ ## member) #define PCPU_ADD(member, val) __PCPU_ADD(pc_ ## member, val) #define PCPU_INC(member) __PCPU_INC(pc_ ## member) diff --git a/sys/i386/isa/elink.h b/sys/i386/isa/elink.h index 9b27088e7899..b0083ca3f2e7 100644 --- a/sys/i386/isa/elink.h +++ b/sys/i386/isa/elink.h @@ -29,11 +29,7 @@ * $FreeBSD$ */ -#ifdef PC98 -#define ELINK_ID_PORT 0x71d0 -#else #define ELINK_ID_PORT 0x100 -#endif #define ELINK_RESET 0xc0 #define ELINK_507_POLY 0xe7 diff --git a/sys/i386/isa/npx.c b/sys/i386/isa/npx.c index 944ebf7c474b..bf1c66a8ef43 100644 --- a/sys/i386/isa/npx.c +++ b/sys/i386/isa/npx.c @@ -304,14 +304,6 @@ npx_probe(void) */ control &= ~(1 << 2); /* enable divide by 0 trap */ fldcw(control); -#ifdef FPU_ERROR_BROKEN - /* - * FPU error signal doesn't work on some CPU - * accelerator board. - */ - hw_float = 1; - return (1); -#endif npx_traps_while_probing = 0; fp_divide_by_0(); if (npx_traps_while_probing != 0) { @@ -1357,9 +1349,7 @@ static driver_t npxisa_driver = { static devclass_t npxisa_devclass; DRIVER_MODULE(npxisa, isa, npxisa_driver, npxisa_devclass, 0, 0); -#ifndef PC98 DRIVER_MODULE(npxisa, acpi, npxisa_driver, npxisa_devclass, 0, 0); -#endif #endif /* DEV_ISA */ static MALLOC_DEFINE(M_FPUKERN_CTX, "fpukern_ctx", diff --git a/sys/i386/pci/pci_pir.c b/sys/i386/pci/pci_pir.c index 6aeaae3502be..60f947ad7ffc 100644 --- a/sys/i386/pci/pci_pir.c +++ b/sys/i386/pci/pci_pir.c @@ -108,13 +108,8 @@ static int pir_interrupt_weight[NUM_ISA_INTERRUPTS]; SYSCTL_DECL(_hw_pci); /* XXX this likely should live in a header file */ -#ifdef PC98 -/* IRQs 3, 5, 7, 9, 10, 11, 12, 13 */ -#define PCI_IRQ_OVERRIDE_MASK 0x3e68 -#else /* IRQs 3, 4, 5, 6, 7, 9, 10, 11, 12, 14, 15 */ #define PCI_IRQ_OVERRIDE_MASK 0xdef8 -#endif static uint32_t pci_irq_override_mask = PCI_IRQ_OVERRIDE_MASK; SYSCTL_INT(_hw_pci, OID_AUTO, irq_override_mask, CTLFLAG_RDTUN, diff --git a/sys/isa/isareg.h b/sys/isa/isareg.h index c959d74128d0..ff2e264b1e59 100644 --- a/sys/isa/isareg.h +++ b/sys/isa/isareg.h @@ -33,10 +33,6 @@ * $FreeBSD$ */ -#ifdef PC98 -#error isareg.h is included from PC-9801 source -#endif - #ifndef _ISA_ISA_H_ #define _ISA_ISA_H_ diff --git a/sys/isa/isavar.h b/sys/isa/isavar.h index 3b1a2e63e8b2..f9c2f9d6abe8 100644 --- a/sys/isa/isavar.h +++ b/sys/isa/isavar.h @@ -186,19 +186,6 @@ void isa_hint_device_unit(device_t bus, device_t child, const char *name, int *unitp); int isab_attach(device_t dev); -#ifdef PC98 -#include <machine/bus.h> - -/* - * Allocate discontinuous resources for ISA bus. - */ -struct resource * -isa_alloc_resourcev(device_t child, int type, int *rid, - bus_addr_t *res, bus_size_t count, u_int flags); -int -isa_load_resourcev(struct resource *re, bus_addr_t *res, bus_size_t count); -#endif - #endif /* _KERNEL */ #endif /* !_ISA_ISAVAR_H_ */ diff --git a/sys/isa/pnp.c b/sys/isa/pnp.c index db37fa629ea3..5b7a45c8aaf6 100644 --- a/sys/isa/pnp.c +++ b/sys/isa/pnp.c @@ -94,17 +94,6 @@ struct pnp_quirk pnp_quirks[] = { { 0 } }; -#ifdef PC98 -/* Some NEC PnP cards have 9 bytes serial code. */ -static pnp_id necids[] = { - {0x4180a3b8, 0xffffffff, 0x00}, /* PC-9801CB-B04 (NEC8041) */ - {0x5181a3b8, 0xffffffff, 0x46}, /* PC-9821CB2-B04(NEC8151) */ - {0x5182a3b8, 0xffffffff, 0xb8}, /* PC-9801-XX (NEC8251) */ - {0x9181a3b8, 0xffffffff, 0x00}, /* PC-9801-120 (NEC8191) */ - {0, 0, 0} -}; -#endif - /* The READ_DATA port that we are using currently */ static int pnp_rd_port; @@ -677,10 +666,6 @@ pnp_isolation_protocol(device_t parent) u_char *resources = NULL; int space = 0; int error; -#ifdef PC98 - int n, necpnp; - u_char buffer[10]; -#endif /* * Put all cards into the Sleep state so that we can clear @@ -722,28 +707,6 @@ pnp_isolation_protocol(device_t parent) * logical devices on the card. */ pnp_write(PNP_SET_CSN, csn); -#ifdef PC98 - if (bootverbose) - printf("PnP Vendor ID = %x\n", id.vendor_id); - /* Check for NEC PnP (9 bytes serial). */ - for (n = necpnp = 0; necids[n].vendor_id; n++) { - if (id.vendor_id == necids[n].vendor_id) { - necpnp = 1; - break; - } - } - if (necpnp) { - if (bootverbose) - printf("An NEC-PnP card (%s).\n", - pnp_eisaformat(id.vendor_id)); - /* Read dummy 9 bytes serial area. */ - pnp_get_resource_info(buffer, 9); - } else { - if (bootverbose) - printf("A Normal-ISA-PnP card (%s).\n", - pnp_eisaformat(id.vendor_id)); - } -#endif if (bootverbose) printf("Reading PnP configuration for %s.\n", pnp_eisaformat(id.vendor_id)); diff --git a/sys/isa/pnpreg.h b/sys/isa/pnpreg.h index abd181198d41..1b4cdc77822f 100644 --- a/sys/isa/pnpreg.h +++ b/sys/isa/pnpreg.h @@ -40,13 +40,8 @@ #define PNP_MAX_CARDS 8 /* Static ports to access PnP state machine */ -#ifdef PC98 -#define _PNP_ADDRESS 0x259 -#define _PNP_WRITE_DATA 0xa59 -#else #define _PNP_ADDRESS 0x279 #define _PNP_WRITE_DATA 0xa79 -#endif /* PnP Registers. Write to ADDRESS and then use WRITE/READ_DATA */ #define PNP_SET_RD_DATA 0x00 diff --git a/sys/kern/kern_pmc.c b/sys/kern/kern_pmc.c index 09dc6edbcffe..43943da72213 100644 --- a/sys/kern/kern_pmc.c +++ b/sys/kern/kern_pmc.c @@ -59,10 +59,10 @@ MALLOC_DEFINE(M_PMCHOOKS, "pmchooks", "Memory space for PMC hooks"); const int pmc_kernel_version = PMC_KERNEL_VERSION; /* Hook variable. */ -int (*pmc_hook)(struct thread *td, int function, void *arg) = NULL; +int __read_mostly (*pmc_hook)(struct thread *td, int function, void *arg) = NULL; /* Interrupt handler */ -int (*pmc_intr)(int cpu, struct trapframe *tf) = NULL; +int __read_mostly (*pmc_intr)(int cpu, struct trapframe *tf) = NULL; /* Bitmask of CPUs requiring servicing at hardclock time */ volatile cpuset_t pmc_cpumask; diff --git a/sys/kern/vfs_vnops.c b/sys/kern/vfs_vnops.c index 06a9e129e6b0..064786426cb6 100644 --- a/sys/kern/vfs_vnops.c +++ b/sys/kern/vfs_vnops.c @@ -2460,10 +2460,12 @@ vn_mmap(struct file *fp, vm_map_t map, vm_offset_t *addr, vm_size_t size, } #ifdef HWPMC_HOOKS /* Inform hwpmc(4) if an executable is being mapped. */ - if (error == 0 && (prot & VM_PROT_EXECUTE) != 0) { - pkm.pm_file = vp; - pkm.pm_address = (uintptr_t) *addr; - PMC_CALL_HOOK(td, PMC_FN_MMAP, (void *) &pkm); + if (PMC_HOOK_INSTALLED(PMC_FN_MMAP)) { + if ((prot & VM_PROT_EXECUTE) != 0 && error == 0) { + pkm.pm_file = vp; + pkm.pm_address = (uintptr_t) *addr; + PMC_CALL_HOOK(td, PMC_FN_MMAP, (void *) &pkm); + } } #endif return (error); diff --git a/sys/mips/conf/BERI_TEMPLATE b/sys/mips/conf/BERI_TEMPLATE index 7901f7722493..5371d935fa52 100644 --- a/sys/mips/conf/BERI_TEMPLATE +++ b/sys/mips/conf/BERI_TEMPLATE @@ -33,6 +33,9 @@ options KTRACE options CAPABILITY_MODE options CAPABILITIES +options COMPAT_FREEBSD10 +options COMPAT_FREEBSD11 + options SCHED_ULE options FFS #Berkeley Fast Filesystem diff --git a/sys/mips/conf/ERL b/sys/mips/conf/ERL index 59ea84d70f35..2c4fd26ba99c 100644 --- a/sys/mips/conf/ERL +++ b/sys/mips/conf/ERL @@ -21,7 +21,7 @@ ident ERL -makeoptions ARCH_FLAGS="-march=octeon -mabi=64" +makeoptions ARCH_FLAGS="-march=octeon+ -mabi=64" makeoptions LDSCRIPT_NAME=ldscript.mips.octeon1 makeoptions KERNLOADADDR=0xffffffff80100000 diff --git a/sys/modules/Makefile b/sys/modules/Makefile index 77ca00bd4e7c..f6859228cf64 100644 --- a/sys/modules/Makefile +++ b/sys/modules/Makefile @@ -51,7 +51,6 @@ SUBDIR= \ ${_auxio} \ ${_bce} \ bfe \ - bhnd \ bge \ bhnd \ ${_bxe} \ @@ -65,8 +64,6 @@ SUBDIR= \ bwn_pci \ ${_bytgpio} \ cam \ - ${_canbepm} \ - ${_canbus} \ ${_cardbus} \ ${_carp} \ cas \ @@ -92,7 +89,6 @@ SUBDIR= \ ${_crypto} \ ${_cryptodev} \ ${_cs} \ - ${_ct} \ ${_ctau} \ ctl \ ${_cxgb} \ @@ -296,7 +292,6 @@ SUBDIR= \ ${_pflog} \ ${_pfsync} \ plip \ - ${_pmc} \ ${_pms} \ ppbus \ ppc \ @@ -345,7 +340,6 @@ SUBDIR= \ sk \ smbfs \ sn \ - ${_snc} \ snp \ sound \ ${_speaker} \ @@ -599,7 +593,7 @@ _vxge= vxge _wbwd= wbwd _wi= wi _xe= xe -.if ${MACHINE} != "pc98" + _aac= aac _aacraid= aacraid _acpi= acpi @@ -680,7 +674,6 @@ _wpifw= wpifw .endif _x86bios= x86bios .endif -.endif .if ${MACHINE_CPUARCH} == "amd64" _efirt= efirt @@ -730,7 +723,6 @@ _sbni= sbni _streams= streams _stg= stg _svr4= svr4 -.if ${MACHINE} == "i386" .if ${MK_EISA} != "no" _ahb= ahb .endif @@ -740,13 +732,6 @@ _ctau= ctau .endif _dpt= dpt _ex= ex -.elif ${MACHINE} == "pc98" -_canbepm= canbepm -_canbus= canbus -_ct= ct -_pmc= pmc -_snc= snc -.endif .endif .if ${MACHINE_CPUARCH} == "arm" diff --git a/sys/modules/Makefile.inc b/sys/modules/Makefile.inc index b20b99b7a75c..a81b6b1edc37 100644 --- a/sys/modules/Makefile.inc +++ b/sys/modules/Makefile.inc @@ -1,7 +1,3 @@ # $FreeBSD$ -.if ${MACHINE} == "pc98" -CFLAGS+= -DPC98 -.endif - SUBDIR_PARALLEL= yes diff --git a/sys/modules/aic/Makefile b/sys/modules/aic/Makefile index 860d9a8a9499..4c0277f86eb0 100644 --- a/sys/modules/aic/Makefile +++ b/sys/modules/aic/Makefile @@ -3,14 +3,8 @@ .PATH: ${.CURDIR}/../../dev/aic KMOD= aic -SRCS= aic.c aic_pccard.c +SRCS= aic.c aic_isa.c aic_pccard.c SRCS+= device_if.h bus_if.h pci_if.h isa_if.h card_if.h pccarddevs.h SRCS+= opt_cam.h opt_scsi.h -.if ${MACHINE} == "pc98" -SRCS+= aic_cbus.c -.else -SRCS+= aic_isa.c -.endif - .include <bsd.kmod.mk> diff --git a/sys/modules/apm/Makefile b/sys/modules/apm/Makefile index 96703b15fab6..d7be22d65982 100644 --- a/sys/modules/apm/Makefile +++ b/sys/modules/apm/Makefile @@ -1,15 +1,9 @@ # $FreeBSD$ .PATH: ${.CURDIR}/../../i386/bios -.if ${MACHINE} == "pc98" -.PATH: ${.CURDIR}/../../pc98/apm -.endif KMOD= apm SRCS= apm.c apm.h -.if ${MACHINE} == "pc98" -SRCS+= apm_bioscall.S -.endif SRCS+= device_if.h bus_if.h EXPORT_SYMS= apm_display \ diff --git a/sys/modules/ata/Makefile b/sys/modules/ata/Makefile index c14fb8c2ccd5..21d853325824 100644 --- a/sys/modules/ata/Makefile +++ b/sys/modules/ata/Makefile @@ -2,11 +2,7 @@ SUBDIR = atacore SUBDIR += atacard -.if ${MACHINE} == "pc98" -SUBDIR += atacbus -.else SUBDIR += ataisa -.endif SUBDIR += atapci .include <bsd.subdir.mk> diff --git a/sys/modules/ata/atacbus/Makefile b/sys/modules/ata/atacbus/Makefile deleted file mode 100644 index a291ad4a165f..000000000000 --- a/sys/modules/ata/atacbus/Makefile +++ /dev/null @@ -1,9 +0,0 @@ -# $FreeBSD$ - -.PATH: ${.CURDIR}/../../../dev/ata - -KMOD= atacbus -SRCS= ata-cbus.c -SRCS+= ata_if.h bus_if.h device_if.h isa_if.h - -.include <bsd.kmod.mk> diff --git a/sys/modules/canbepm/Makefile b/sys/modules/canbepm/Makefile deleted file mode 100644 index 0eb911243eee..000000000000 --- a/sys/modules/canbepm/Makefile +++ /dev/null @@ -1,8 +0,0 @@ -# $FreeBSD$ - -.PATH: ${.CURDIR}/../../pc98/pc98 -KMOD = canbepm -SRCS = canbepm.c -SRCS += device_if.h bus_if.h canbus_if.h - -.include <bsd.kmod.mk> diff --git a/sys/modules/canbus/Makefile b/sys/modules/canbus/Makefile deleted file mode 100644 index 19487e01ef3d..000000000000 --- a/sys/modules/canbus/Makefile +++ /dev/null @@ -1,8 +0,0 @@ -# $FreeBSD$ - -.PATH: ${.CURDIR}/../../pc98/pc98 -KMOD = canbus -SRCS = canbus.c -SRCS += device_if.h bus_if.h canbus_if.h canbus_if.c - -.include <bsd.kmod.mk> diff --git a/sys/modules/ct/Makefile b/sys/modules/ct/Makefile deleted file mode 100644 index 91cb936dbb4a..000000000000 --- a/sys/modules/ct/Makefile +++ /dev/null @@ -1,10 +0,0 @@ -# $FreeBSD$ - -.PATH: ${.CURDIR}/../../dev/ct - -KMOD= ct -SRCS= bshw_machdep.c ct.c ct_isa.c -SRCS+= device_if.h bus_if.h isa_if.h -SRCS+= opt_ct.h opt_cam.h opt_scsi.h opt_ddb.h - -.include <bsd.kmod.mk> diff --git a/sys/modules/drm2/Makefile b/sys/modules/drm2/Makefile index 6ba0def9597e..52fc3e241ff1 100644 --- a/sys/modules/drm2/Makefile +++ b/sys/modules/drm2/Makefile @@ -3,7 +3,7 @@ SYSDIR?=${.CURDIR}/../.. .include "${SYSDIR}/conf/kern.opts.mk" -.if ${MACHINE_CPUARCH} == "amd64" +.if ${MACHINE_CPUARCH} == "amd64" || ${MACHINE_CPUARCH} == "i386" _i915kms= i915kms _radeonkms= radeonkms . if ${MK_SOURCELESS_UCODE} != "no" @@ -11,16 +11,6 @@ _radeonkmsfw= radeonkmsfw . endif .endif -.if ${MACHINE_CPUARCH} == "i386" -. if ${MACHINE} != "pc98" -_i915kms= i915kms -_radeonkms= radeonkms -. if ${MK_SOURCELESS_UCODE} != "no" -_radeonkmsfw= radeonkmsfw -. endif -. endif -.endif - .if ${MACHINE_CPUARCH} == "powerpc" _radeonkms= radeonkms . if ${MK_SOURCELESS_UCODE} != "no" diff --git a/sys/modules/dtb/am335x/Makefile b/sys/modules/dtb/am335x/Makefile index b60f4a9c5ed7..f862b7897e6c 100644 --- a/sys/modules/dtb/am335x/Makefile +++ b/sys/modules/dtb/am335x/Makefile @@ -1,8 +1,13 @@ # $FreeBSD$ # All the dts files for am335x systems we support. DTS= \ - beaglebone.dts \ - beaglebone-black.dts \ + am335x-bone.dts \ + am335x-boneblack.dts \ + am335x-bonegreen.dts \ ufw.dts +LINKS= \ + ${DTBDIR}/am3335x-bone.dtb ${DTBDIR}/beaglebone.dtb \ + ${DTBDIR}/am3335x-boneblack.dtb ${DTBDIR}/beaglebone-black.dtb + .include <bsd.dtb.mk> diff --git a/sys/modules/ed/Makefile b/sys/modules/ed/Makefile index 427b99f973cd..a6a74b16470c 100644 --- a/sys/modules/ed/Makefile +++ b/sys/modules/ed/Makefile @@ -5,14 +5,10 @@ KMOD= if_ed SRCS= if_ed.c SRCS+= if_ed_novell.c if_ed_wd80x3.c if_ed_rtl80x9.c isa_if.h -.if ${MACHINE} == "pc98" -SRCS+= if_ed_cbus.c -.else SRCS+= if_ed_isa.c SRCS.ED_HPP=if_ed_hpp.c SRCS.ED_SIC=if_ed_sic.c SRCS.ED_3C503=if_ed_3c503.c -.endif SRCS+= if_ed_pccard.c pccarddevs.h card_if.h SRCS.DEV_PCI=if_ed_pci.c pci_if.h diff --git a/sys/modules/fdc/Makefile b/sys/modules/fdc/Makefile index 40eb42719379..b19f204aacd0 100644 --- a/sys/modules/fdc/Makefile +++ b/sys/modules/fdc/Makefile @@ -3,14 +3,10 @@ KMOD= fdc .PATH: ${.CURDIR}/../../dev/fdc -.if ${MACHINE} == "pc98" -SRCS= fdc.c fdc_cbus.c -.else SRCS= fdc.c fdc_isa.c fdc_pccard.c .if ${MACHINE} == "i386" || ${MACHINE} == "amd64" SRCS+= opt_acpi.h acpi_if.h fdc_acpi.c .endif -.endif SRCS+= opt_fdc.h bus_if.h card_if.h device_if.h \ isa_if.h pccarddevs.h diff --git a/sys/modules/fe/Makefile b/sys/modules/fe/Makefile index 77af85bfd63b..81a7e12905e0 100644 --- a/sys/modules/fe/Makefile +++ b/sys/modules/fe/Makefile @@ -3,13 +3,7 @@ .PATH: ${.CURDIR}/../../dev/fe KMOD= if_fe -SRCS= if_fe.c if_fe_pccard.c - -.if ${MACHINE} == "pc98" -SRCS+= if_fe_cbus.c -.else -SRCS+= if_fe_isa.c -.endif +SRCS= if_fe.c if_fe_isa.c if_fe_pccard.c SRCS+= bus_if.h card_if.h device_if.h isa_if.h pccarddevs.h diff --git a/sys/modules/geom/geom_part/Makefile b/sys/modules/geom/geom_part/Makefile index aa6059c3ba82..a83ef624db78 100644 --- a/sys/modules/geom/geom_part/Makefile +++ b/sys/modules/geom/geom_part/Makefile @@ -7,7 +7,6 @@ SUBDIR= geom_part_apm \ geom_part_gpt \ geom_part_ldm \ geom_part_mbr \ - geom_part_pc98 \ geom_part_vtoc8 .include <bsd.subdir.mk> diff --git a/sys/modules/geom/geom_part/geom_part_pc98/Makefile b/sys/modules/geom/geom_part/geom_part_pc98/Makefile deleted file mode 100644 index 283809f3d6b3..000000000000 --- a/sys/modules/geom/geom_part/geom_part_pc98/Makefile +++ /dev/null @@ -1,10 +0,0 @@ -# $FreeBSD$ - -.PATH: ${.CURDIR}/../../../../geom/part - -KMOD= geom_part_pc98 -SRCS= g_part_pc98.c - -SRCS+= bus_if.h device_if.h g_part_if.h - -.include <bsd.kmod.mk> diff --git a/sys/modules/geom/geom_pc98/Makefile b/sys/modules/geom/geom_pc98/Makefile deleted file mode 100644 index 2c5952d3e4f0..000000000000 --- a/sys/modules/geom/geom_pc98/Makefile +++ /dev/null @@ -1,8 +0,0 @@ -# $FreeBSD$ - -.PATH: ${.CURDIR}/../../../geom - -KMOD= geom_pc98 -SRCS= geom_pc98.c geom_pc98_enc.c - -.include <bsd.kmod.mk> diff --git a/sys/modules/i2c/controllers/Makefile b/sys/modules/i2c/controllers/Makefile index 132ff2d3babe..d4e8296ba960 100644 --- a/sys/modules/i2c/controllers/Makefile +++ b/sys/modules/i2c/controllers/Makefile @@ -1,9 +1,5 @@ # $FreeBSD$ -.if ${MACHINE} == "pc98" -SUBDIR = lpbb -.else SUBDIR = alpm amdpm amdsmb ichiic ichsmb intpm ismt nfsmb viapm lpbb pcf -.endif .include <bsd.subdir.mk> diff --git a/sys/modules/le/Makefile b/sys/modules/le/Makefile index d267cbec2c26..4880af1d2caa 100644 --- a/sys/modules/le/Makefile +++ b/sys/modules/le/Makefile @@ -3,16 +3,12 @@ .PATH: ${.CURDIR}/../../dev/le KMOD= if_le -SRCS= am7990.c am79900.c ${if_le_cbus} ${if_le_isa} ${if_le_lebuffer} +SRCS= am7990.c am79900.c ${if_le_isa} ${if_le_lebuffer} SRCS+= ${if_le_ledma} if_le_pci.c lance.c ${lebuffer_sbus} SRCS+= bus_if.h device_if.h ${isa_if} ${ofw_bus_if} pci_if.h .if ${MACHINE_CPUARCH} == "i386" -.if ${MACHINE} == "pc98" -if_le_cbus= if_le_cbus.c -.else if_le_isa= if_le_isa.c -.endif isa_if= isa_if.h .endif diff --git a/sys/modules/mse/Makefile b/sys/modules/mse/Makefile index 4cc68c1f9c6d..af515b2e80b9 100644 --- a/sys/modules/mse/Makefile +++ b/sys/modules/mse/Makefile @@ -3,12 +3,6 @@ .PATH: ${.CURDIR}/../../dev/mse KMOD= mse -SRCS= mse.c device_if.h bus_if.h isa_if.h - -.if (${MACHINE} == "pc98") -SRCS+= mse_cbus.c -.else -SRCS+= mse_isa.c -.endif +SRCS= mse.c mse_isa.c device_if.h bus_if.h isa_if.h .include <bsd.kmod.mk> diff --git a/sys/modules/pmc/Makefile b/sys/modules/pmc/Makefile deleted file mode 100644 index 60dd3503dfcd..000000000000 --- a/sys/modules/pmc/Makefile +++ /dev/null @@ -1,9 +0,0 @@ -# $FreeBSD$ - -.PATH: ${.CURDIR}/../../pc98/cbus - -KMOD= pmc -SRCS= pmc.c -SRCS+= bus_if.h device_if.h isa_if.h - -.include <bsd.kmod.mk> diff --git a/sys/modules/ppc/Makefile b/sys/modules/ppc/Makefile index 53621f119baa..76323b4cd065 100644 --- a/sys/modules/ppc/Makefile +++ b/sys/modules/ppc/Makefile @@ -6,15 +6,8 @@ SRCS= bus_if.h device_if.h ppbus_if.h isa_if.h pci_if.h serdev_if.h \ opt_ppc.h opt_isa.h \ ppc.c ppc_pci.c ppc_puc.c -.if ${MACHINE_CPUARCH} == "amd64" +.if ${MACHINE_CPUARCH} == "amd64" || ${MACHINE_CPUARCH} == "i386" SRCS+= ppc_acpi.c ppc_isa.c .endif -.if ${MACHINE_CPUARCH} == "i386" -.if ${MACHINE} != "pc98" -SRCS+= ppc_acpi.c -.endif -SRCS+= ppc_isa.c -.endif - .include <bsd.kmod.mk> diff --git a/sys/modules/sio/Makefile b/sys/modules/sio/Makefile index 057e9c614d42..9e162807b66a 100644 --- a/sys/modules/sio/Makefile +++ b/sys/modules/sio/Makefile @@ -1,29 +1,15 @@ # $FreeBSD$ -.if ${MACHINE} == "pc98" -.PATH: ${.CURDIR}/../../pc98/cbus -.endif .PATH: ${.CURDIR}/../../dev/sio KMOD= sio SRCS= bus_if.h card_if.h device_if.h isa_if.h pci_if.h serdev_if.h \ opt_compat.h opt_gdb.h opt_kdb.h opt_sio.h \ - sio.c sio_pccard.c sio_pci.c sio_puc.c pccarddevs.h -.if ${MACHINE} == "pc98" -SRCS+= sio_cbus.c -.else -SRCS+= sio_isa.c -.endif + sio.c sio_isa.c sio_pccard.c sio_pci.c sio_puc.c pccarddevs.h .if !defined(KERNBUILDDIR) opt_compat.h: echo "#define COMPAT_43 1" > ${.TARGET} - -.if ${MACHINE} == "pc98" -opt_sio.h: - echo "#define COM_MULTIPORT 1" > ${.TARGET} - echo "#define COM_ESP 1" >> ${.TARGET} -.endif .endif .include <bsd.kmod.mk> diff --git a/sys/modules/snc/Makefile b/sys/modules/snc/Makefile deleted file mode 100644 index 837248609c87..000000000000 --- a/sys/modules/snc/Makefile +++ /dev/null @@ -1,9 +0,0 @@ -# $FreeBSD$ - -.PATH: ${.CURDIR}/../../dev/snc - -KMOD= if_snc -SRCS= if_snc.c if_snc_cbus.c if_snc_pccard.c dp83932.c dp83932subr.c -SRCS+= opt_inet.h device_if.h bus_if.h isa_if.h card_if.h pccarddevs.h - -.include <bsd.kmod.mk> diff --git a/sys/modules/sound/sound/Makefile b/sys/modules/sound/sound/Makefile index ff9c48e66f7e..274d25f69170 100644 --- a/sys/modules/sound/sound/Makefile +++ b/sys/modules/sound/sound/Makefile @@ -34,8 +34,7 @@ CLEANFILES+= feeder_eq_gen.h feeder_rate_gen.h snd_fxdiv_gen.h EXPORT_SYMS= YES # XXX evaluate -.if ${MACHINE_CPUARCH} != "i386" && ${MACHINE_CPUARCH} != "amd64" && \ - ${MACHINE_CPUARCH} != "pc98" +.if ${MACHINE_CPUARCH} != "i386" && ${MACHINE_CPUARCH} != "amd64" # Create an empty opt_isa.h in order to keep kmod.mk from linking in an # existing one from KERNBUILDDIR which possibly has DEV_ISA defined so # sound.ko is always built without isadma support. diff --git a/sys/net/if.c b/sys/net/if.c index 043ecdfea1cc..edd9469bb9a5 100644 --- a/sys/net/if.c +++ b/sys/net/if.c @@ -59,7 +59,6 @@ #include <sys/domain.h> #include <sys/jail.h> #include <sys/priv.h> -#include <sys/eventhandler.h> #include <machine/stdarg.h> #include <vm/uma.h> @@ -3531,7 +3530,6 @@ if_setlladdr(struct ifnet *ifp, const u_char *lladdr, int len) case IFT_BRIDGE: case IFT_ARCNET: case IFT_IEEE8023ADLAG: - case IFT_IEEE80211: bcopy(lladdr, LLADDR(sdl), len); ifa_free(ifa); break; diff --git a/sys/net/if_stf.c b/sys/net/if_stf.c index 5209bc838f25..d11ec54de59b 100644 --- a/sys/net/if_stf.c +++ b/sys/net/if_stf.c @@ -202,10 +202,16 @@ stf_clone_match(struct if_clone *ifc, const char *name) static int stf_clone_create(struct if_clone *ifc, char *name, size_t len, caddr_t params) { - int err, unit; + char *dp; + int err, unit, wildcard; struct stf_softc *sc; struct ifnet *ifp; + err = ifc_name2unit(name, &unit); + if (err != 0) + return (err); + wildcard = (unit < 0); + /* * We can only have one unit, but since unit allocation is * already locked, we use it to keep from allocating extra @@ -229,7 +235,20 @@ stf_clone_create(struct if_clone *ifc, char *name, size_t len, caddr_t params) /* * Set the name manually rather then using if_initname because * we don't conform to the default naming convention for interfaces. + * In the wildcard case, we need to update the name. */ + if (wildcard) { + for (dp = name; *dp != '\0'; dp++); + if (snprintf(dp, len - (dp-name), "%d", unit) > + len - (dp-name) - 1) { + /* + * This can only be a programmer error and + * there's no straightforward way to recover if + * it happens. + */ + panic("if_clone_create(): interface name too long"); + } + } strlcpy(ifp->if_xname, name, IFNAMSIZ); ifp->if_dname = stfname; ifp->if_dunit = IF_DUNIT_NONE; diff --git a/sys/net/if_types.h b/sys/net/if_types.h index 92e101ac6af4..caa2c2711d49 100644 --- a/sys/net/if_types.h +++ b/sys/net/if_types.h @@ -113,7 +113,7 @@ typedef enum { IFT_QLLC = 0x44, /* SNA QLLC */ IFT_FASTETHERFX = 0x45, /* Fast Ethernet (100BaseFX) */ IFT_CHANNEL = 0x46, /* channel */ - IFT_IEEE80211 = 0x47, /* radio spread spectrum */ + IFT_IEEE80211 = 0x47, /* radio spread spectrum (unused) */ IFT_IBM370PARCHAN = 0x48, /* IBM System 360/370 OEMI Channel */ IFT_ESCON = 0x49, /* IBM Enterprise Systems Connection */ IFT_DLSW = 0x4a, /* Data Link Switching */ diff --git a/sys/net/if_var.h b/sys/net/if_var.h index 7c8fd7ec80a4..48122900f27c 100644 --- a/sys/net/if_var.h +++ b/sys/net/if_var.h @@ -404,6 +404,11 @@ EVENTHANDLER_DECLARE(ifnet_departure_event, ifnet_departure_event_handler_t); /* Interface link state change event */ typedef void (*ifnet_link_event_handler_t)(void *, struct ifnet *, int); EVENTHANDLER_DECLARE(ifnet_link_event, ifnet_link_event_handler_t); +/* Interface up/down event */ +#define IFNET_EVENT_UP 0 +#define IFNET_EVENT_DOWN 1 +typedef void (*ifnet_event_fn)(void *, struct ifnet *ifp, int event); +EVENTHANDLER_DECLARE(ifnet_event, ifnet_event_fn); #endif /* _SYS_EVENTHANDLER_H_ */ /* diff --git a/sys/net/iflib.c b/sys/net/iflib.c index acad313c51cc..ad91a24ab6aa 100644 --- a/sys/net/iflib.c +++ b/sys/net/iflib.c @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2014-2016, Matthew Macy <mmacy@nextbsd.org> + * Copyright (c) 2014-2017, Matthew Macy <mmacy@nextbsd.org> * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -264,18 +264,12 @@ iflib_get_sctx(if_ctx_t ctx) #define RX_SW_DESC_INUSE (1 << 3) #define TX_SW_DESC_MAPPED (1 << 4) -typedef struct iflib_sw_rx_desc { - bus_dmamap_t ifsd_map; /* bus_dma map for packet */ - struct mbuf *ifsd_m; /* rx: uninitialized mbuf */ - caddr_t ifsd_cl; /* direct cluster pointer for rx */ - uint16_t ifsd_flags; -} *iflib_rxsd_t; - -typedef struct iflib_sw_tx_desc_val { - bus_dmamap_t ifsd_map; /* bus_dma map for packet */ - struct mbuf *ifsd_m; /* pkthdr mbuf */ - uint8_t ifsd_flags; -} *iflib_txsd_val_t; +typedef struct iflib_sw_rx_desc_array { + bus_dmamap_t *ifsd_map; /* bus_dma maps for packet */ + struct mbuf **ifsd_m; /* pkthdr mbufs */ + caddr_t *ifsd_cl; /* direct cluster pointer for rx */ + uint8_t *ifsd_flags; +} iflib_rxsd_array_t; typedef struct iflib_sw_tx_desc_array { bus_dmamap_t *ifsd_map; /* bus_dma maps for packet */ @@ -287,7 +281,7 @@ typedef struct iflib_sw_tx_desc_array { /* magic number that should be high enough for any hardware */ #define IFLIB_MAX_TX_SEGS 128 #define IFLIB_MAX_RX_SEGS 32 -#define IFLIB_RX_COPY_THRESH 128 +#define IFLIB_RX_COPY_THRESH 63 #define IFLIB_MAX_RX_REFRESH 32 #define IFLIB_QUEUE_IDLE 0 #define IFLIB_QUEUE_HUNG 1 @@ -383,7 +377,7 @@ struct iflib_fl { uint16_t ifl_buf_size; uint16_t ifl_cltype; uma_zone_t ifl_zone; - iflib_rxsd_t ifl_sds; + iflib_rxsd_array_t ifl_sds; iflib_rxq_t ifl_rxq; uint8_t ifl_id; bus_dma_tag_t ifl_desc_tag; @@ -909,7 +903,7 @@ iflib_netmap_rxsync(struct netmap_kring *kring, int flags) ring->slot[nm_i].len = ri.iri_len - crclen; ring->slot[nm_i].flags = slot_flags; bus_dmamap_sync(fl->ifl_ifdi->idi_tag, - fl->ifl_sds[nic_i].ifsd_map, BUS_DMASYNC_POSTREAD); + fl->ifl_sds.ifsd_map[nic_i], BUS_DMASYNC_POSTREAD); nm_i = nm_next(nm_i, lim); nic_i = nm_next(nic_i, lim); } @@ -949,14 +943,14 @@ iflib_netmap_rxsync(struct netmap_kring *kring, int flags) vaddr = addr; if (slot->flags & NS_BUF_CHANGED) { /* buffer has changed, reload map */ - netmap_reload_map(na, fl->ifl_ifdi->idi_tag, fl->ifl_sds[nic_i].ifsd_map, addr); + netmap_reload_map(na, fl->ifl_ifdi->idi_tag, fl->ifl_sds.ifsd_map[nic_i], addr); slot->flags &= ~NS_BUF_CHANGED; } /* * XXX we should be batching this operation - TODO */ ctx->isc_rxd_refill(ctx->ifc_softc, rxq->ifr_id, fl->ifl_id, nic_i, &paddr, &vaddr, 1, fl->ifl_buf_size); - bus_dmamap_sync(fl->ifl_ifdi->idi_tag, fl->ifl_sds[nic_i].ifsd_map, + bus_dmamap_sync(fl->ifl_ifdi->idi_tag, fl->ifl_sds.ifsd_map[nic_i], BUS_DMASYNC_PREREAD); nm_i = nm_next(nm_i, lim); nic_i = nm_next(nic_i, lim); @@ -1030,22 +1024,22 @@ iflib_netmap_rxq_init(if_ctx_t ctx, iflib_rxq_t rxq) { struct netmap_adapter *na = NA(ctx->ifc_ifp); struct netmap_slot *slot; - iflib_rxsd_t sd; + bus_dmamap_t *map; int nrxd; slot = netmap_reset(na, NR_RX, rxq->ifr_id, 0); if (slot == 0) return; - sd = rxq->ifr_fl[0].ifl_sds; + map = rxq->ifr_fl[0].ifl_sds.ifsd_map; nrxd = ctx->ifc_softc_ctx.isc_nrxd[0]; - for (int i = 0; i < nrxd; i++, sd++) { + for (int i = 0; i < nrxd; i++, map++) { int sj = netmap_idx_n2k(&na->rx_rings[rxq->ifr_id], i); uint64_t paddr; void *addr; caddr_t vaddr; vaddr = addr = PNMB(na, slot + sj, &paddr); - netmap_load_map(na, rxq->ifr_fl[0].ifl_ifdi->idi_tag, sd->ifsd_map, addr); + netmap_load_map(na, rxq->ifr_fl[0].ifl_ifdi->idi_tag, *map, addr); /* Update descriptor and the cached value */ ctx->isc_rxd_refill(ctx->ifc_softc, rxq->ifr_id, 0 /* fl_id */, i, &paddr, &vaddr, 1, rxq->ifr_fl[0].ifl_buf_size); } @@ -1476,7 +1470,6 @@ iflib_rxsd_alloc(iflib_rxq_t rxq) if_softc_ctx_t scctx = &ctx->ifc_softc_ctx; device_t dev = ctx->ifc_dev; iflib_fl_t fl; - iflib_rxsd_t rxsd; int err; MPASS(scctx->isc_nrxd[0] > 0); @@ -1484,13 +1477,6 @@ iflib_rxsd_alloc(iflib_rxq_t rxq) fl = rxq->ifr_fl; for (int i = 0; i < rxq->ifr_nfl; i++, fl++) { - fl->ifl_sds = malloc(sizeof(struct iflib_sw_rx_desc) * - scctx->isc_nrxd[rxq->ifr_fl_offset], M_IFLIB, - M_WAITOK | M_ZERO); - if (fl->ifl_sds == NULL) { - device_printf(dev, "Unable to allocate rx sw desc memory\n"); - return (ENOMEM); - } fl->ifl_size = scctx->isc_nrxd[rxq->ifr_fl_offset]; /* this isn't necessarily the same */ err = bus_dma_tag_create(bus_get_dma_tag(dev), /* parent */ 1, 0, /* alignment, bounds */ @@ -1509,16 +1495,48 @@ iflib_rxsd_alloc(iflib_rxq_t rxq) __func__, err); goto fail; } + if (!(fl->ifl_sds.ifsd_flags = + (uint8_t *) malloc(sizeof(uint8_t) * + scctx->isc_nrxd[rxq->ifr_fl_offset], M_IFLIB, M_NOWAIT | M_ZERO))) { + device_printf(dev, "Unable to allocate tx_buffer memory\n"); + err = ENOMEM; + goto fail; + } + if (!(fl->ifl_sds.ifsd_m = + (struct mbuf **) malloc(sizeof(struct mbuf *) * + scctx->isc_nrxd[rxq->ifr_fl_offset], M_IFLIB, M_NOWAIT | M_ZERO))) { + device_printf(dev, "Unable to allocate tx_buffer memory\n"); + err = ENOMEM; + goto fail; + } + if (!(fl->ifl_sds.ifsd_cl = + (caddr_t *) malloc(sizeof(caddr_t) * + scctx->isc_nrxd[rxq->ifr_fl_offset], M_IFLIB, M_NOWAIT | M_ZERO))) { + device_printf(dev, "Unable to allocate tx_buffer memory\n"); + err = ENOMEM; + goto fail; + } - rxsd = fl->ifl_sds; - for (int i = 0; i < scctx->isc_nrxd[rxq->ifr_fl_offset]; i++, rxsd++) { - err = bus_dmamap_create(fl->ifl_desc_tag, 0, &rxsd->ifsd_map); - if (err) { - device_printf(dev, "%s: bus_dmamap_create failed: %d\n", - __func__, err); + /* Create the descriptor buffer dma maps */ +#if defined(ACPI_DMAR) || (!(defined(__i386__) && !defined(__amd64__))) + if ((ctx->ifc_flags & IFC_DMAR) == 0) + continue; + + if (!(fl->ifl_sds.ifsd_map = + (bus_dmamap_t *) malloc(sizeof(bus_dmamap_t) * scctx->isc_nrxd[rxq->ifr_fl_offset], M_IFLIB, M_NOWAIT | M_ZERO))) { + device_printf(dev, "Unable to allocate tx_buffer map memory\n"); + err = ENOMEM; + goto fail; + } + + for (int i = 0; i < scctx->isc_nrxd[rxq->ifr_fl_offset]; i++) { + err = bus_dmamap_create(fl->ifl_desc_tag, 0, &fl->ifl_sds.ifsd_map[i]); + if (err != 0) { + device_printf(dev, "Unable to create TX DMA map\n"); goto fail; } } +#endif } return (0); @@ -1568,13 +1586,21 @@ static void _iflib_fl_refill(if_ctx_t ctx, iflib_fl_t fl, int count) { struct mbuf *m; - int pidx = fl->ifl_pidx; - iflib_rxsd_t rxsd = &fl->ifl_sds[pidx]; - caddr_t cl; + int idx, pidx = fl->ifl_pidx; + caddr_t cl, *sd_cl; + struct mbuf **sd_m; + uint8_t *sd_flags; + bus_dmamap_t *sd_map; int n, i = 0; uint64_t bus_addr; int err; + sd_m = fl->ifl_sds.ifsd_m; + sd_map = fl->ifl_sds.ifsd_map; + sd_cl = fl->ifl_sds.ifsd_cl; + sd_flags = fl->ifl_sds.ifsd_flags; + idx = pidx; + n = count; MPASS(n > 0); MPASS(fl->ifl_credits + n <= fl->ifl_size); @@ -1597,8 +1623,8 @@ _iflib_fl_refill(if_ctx_t ctx, iflib_fl_t fl, int count) * * If the cluster is still set then we know a minimum sized packet was received */ - if ((cl = rxsd->ifsd_cl) == NULL) { - if ((cl = rxsd->ifsd_cl = m_cljget(NULL, M_NOWAIT, fl->ifl_buf_size)) == NULL) + if ((cl = sd_cl[idx]) == NULL) { + if ((cl = sd_cl[idx] = m_cljget(NULL, M_NOWAIT, fl->ifl_buf_size)) == NULL) break; #if MEMORY_LOGGING fl->ifl_cl_enqueued++; @@ -1613,16 +1639,16 @@ _iflib_fl_refill(if_ctx_t ctx, iflib_fl_t fl, int count) DBG_COUNTER_INC(rx_allocs); #ifdef notyet - if ((rxsd->ifsd_flags & RX_SW_DESC_MAP_CREATED) == 0) { + if ((sd_flags[pidx] & RX_SW_DESC_MAP_CREATED) == 0) { int err; - if ((err = bus_dmamap_create(fl->ifl_ifdi->idi_tag, 0, &rxsd->ifsd_map))) { + if ((err = bus_dmamap_create(fl->ifl_ifdi->idi_tag, 0, &sd_map[idx]))) { log(LOG_WARNING, "bus_dmamap_create failed %d\n", err); uma_zfree(fl->ifl_zone, cl); n = 0; goto done; } - rxsd->ifsd_flags |= RX_SW_DESC_MAP_CREATED; + sd_flags[idx] |= RX_SW_DESC_MAP_CREATED; } #endif #if defined(__i386__) || defined(__amd64__) @@ -1636,7 +1662,7 @@ _iflib_fl_refill(if_ctx_t ctx, iflib_fl_t fl, int count) cb_arg.error = 0; q = fl->ifl_rxq; - err = bus_dmamap_load(fl->ifl_desc_tag, rxsd->ifsd_map, + err = bus_dmamap_load(fl->ifl_desc_tag, sd_map[idx], cl, fl->ifl_buf_size, _rxq_refill_cb, &cb_arg, 0); if (err != 0 || cb_arg.error) { @@ -1651,28 +1677,28 @@ _iflib_fl_refill(if_ctx_t ctx, iflib_fl_t fl, int count) } bus_addr = cb_arg.seg.ds_addr; } - rxsd->ifsd_flags |= RX_SW_DESC_INUSE; + sd_flags[idx] |= RX_SW_DESC_INUSE; - MPASS(rxsd->ifsd_m == NULL); - rxsd->ifsd_cl = cl; - rxsd->ifsd_m = m; + MPASS(sd_m[idx] == NULL); + sd_cl[idx] = cl; + sd_m[idx] = m; fl->ifl_bus_addrs[i] = bus_addr; fl->ifl_vm_addrs[i] = cl; - rxsd++; fl->ifl_credits++; i++; MPASS(fl->ifl_credits <= fl->ifl_size); - if (++fl->ifl_pidx == fl->ifl_size) { - fl->ifl_pidx = 0; + if (++idx == fl->ifl_size) { fl->ifl_gen = 1; - rxsd = fl->ifl_sds; + idx = 0; } if (n == 0 || i == IFLIB_MAX_RX_REFRESH) { ctx->isc_rxd_refill(ctx->ifc_softc, fl->ifl_rxq->ifr_id, fl->ifl_id, pidx, fl->ifl_bus_addrs, fl->ifl_vm_addrs, i, fl->ifl_buf_size); i = 0; - pidx = fl->ifl_pidx; + pidx = idx; } + fl->ifl_pidx = idx; + } done: DBG_COUNTER_INC(rxd_flush); @@ -1706,28 +1732,33 @@ iflib_fl_bufs_free(iflib_fl_t fl) uint32_t i; for (i = 0; i < fl->ifl_size; i++) { - iflib_rxsd_t d = &fl->ifl_sds[i]; - - if (d->ifsd_flags & RX_SW_DESC_INUSE) { - bus_dmamap_unload(fl->ifl_desc_tag, d->ifsd_map); - bus_dmamap_destroy(fl->ifl_desc_tag, d->ifsd_map); - if (d->ifsd_m != NULL) { - m_init(d->ifsd_m, M_NOWAIT, MT_DATA, 0); - uma_zfree(zone_mbuf, d->ifsd_m); + struct mbuf **sd_m = &fl->ifl_sds.ifsd_m[i]; + uint8_t *sd_flags = &fl->ifl_sds.ifsd_flags[i]; + caddr_t *sd_cl = &fl->ifl_sds.ifsd_cl[i]; + + if (*sd_flags & RX_SW_DESC_INUSE) { + if (fl->ifl_sds.ifsd_map != NULL) { + bus_dmamap_t sd_map = fl->ifl_sds.ifsd_map[i]; + bus_dmamap_unload(fl->ifl_desc_tag, sd_map); + bus_dmamap_destroy(fl->ifl_desc_tag, sd_map); + } + if (*sd_m != NULL) { + m_init(*sd_m, M_NOWAIT, MT_DATA, 0); + uma_zfree(zone_mbuf, *sd_m); } - if (d->ifsd_cl != NULL) - uma_zfree(fl->ifl_zone, d->ifsd_cl); - d->ifsd_flags = 0; + if (*sd_cl != NULL) + uma_zfree(fl->ifl_zone, *sd_cl); + *sd_flags = 0; } else { - MPASS(d->ifsd_cl == NULL); - MPASS(d->ifsd_m == NULL); + MPASS(*sd_cl == NULL); + MPASS(*sd_m == NULL); } #if MEMORY_LOGGING fl->ifl_m_dequeued++; fl->ifl_cl_dequeued++; #endif - d->ifsd_cl = NULL; - d->ifsd_m = NULL; + *sd_cl = NULL; + *sd_m = NULL; } /* * Reset free list values @@ -1807,10 +1838,14 @@ iflib_rx_sds_free(iflib_rxq_t rxq) bus_dma_tag_destroy(fl->ifl_desc_tag); fl->ifl_desc_tag = NULL; } + free(fl->ifl_sds.ifsd_m, M_IFLIB); + free(fl->ifl_sds.ifsd_cl, M_IFLIB); + /* XXX destroy maps first */ + free(fl->ifl_sds.ifsd_map, M_IFLIB); + fl->ifl_sds.ifsd_m = NULL; + fl->ifl_sds.ifsd_cl = NULL; + fl->ifl_sds.ifsd_map = NULL; } - if (rxq->ifr_fl->ifl_sds != NULL) - free(rxq->ifr_fl->ifl_sds, M_IFLIB); - free(rxq->ifr_fl, M_IFLIB); rxq->ifr_fl = NULL; rxq->ifr_cq_gen = rxq->ifr_cq_cidx = rxq->ifr_cq_pidx = 0; @@ -1995,13 +2030,33 @@ iflib_stop(if_ctx_t ctx) } } -static iflib_rxsd_t -rxd_frag_to_sd(iflib_rxq_t rxq, if_rxd_frag_t irf, int *cltype, int unload) +static inline void +prefetch_pkts(iflib_fl_t fl, int cidx) +{ + int nextptr; + int nrxd = fl->ifl_size; + + nextptr = (cidx + CACHE_PTR_INCREMENT) & (nrxd-1); + prefetch(&fl->ifl_sds.ifsd_m[nextptr]); + prefetch(&fl->ifl_sds.ifsd_cl[nextptr]); + prefetch(fl->ifl_sds.ifsd_m[(cidx + 1) & (nrxd-1)]); + prefetch(fl->ifl_sds.ifsd_m[(cidx + 2) & (nrxd-1)]); + prefetch(fl->ifl_sds.ifsd_m[(cidx + 3) & (nrxd-1)]); + prefetch(fl->ifl_sds.ifsd_m[(cidx + 4) & (nrxd-1)]); + prefetch(fl->ifl_sds.ifsd_cl[(cidx + 1) & (nrxd-1)]); + prefetch(fl->ifl_sds.ifsd_cl[(cidx + 2) & (nrxd-1)]); + prefetch(fl->ifl_sds.ifsd_cl[(cidx + 3) & (nrxd-1)]); + prefetch(fl->ifl_sds.ifsd_cl[(cidx + 4) & (nrxd-1)]); +} + +static void +rxd_frag_to_sd(iflib_rxq_t rxq, if_rxd_frag_t irf, int *cltype, int unload, iflib_fl_t *pfl, int *pcidx) { int flid, cidx; - iflib_rxsd_t sd; + bus_dmamap_t map; iflib_fl_t fl; iflib_dma_info_t di; + int next; flid = irf->irf_flid; cidx = irf->irf_idx; @@ -2012,16 +2067,22 @@ rxd_frag_to_sd(iflib_rxq_t rxq, if_rxd_frag_t irf, int *cltype, int unload) if (cltype) fl->ifl_cl_dequeued++; #endif - sd = &fl->ifl_sds[cidx]; - di = fl->ifl_ifdi; - bus_dmamap_sync(di->idi_tag, di->idi_map, - BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE); + prefetch_pkts(fl, cidx); + if (fl->ifl_sds.ifsd_map != NULL) { + next = (cidx + CACHE_PTR_INCREMENT) & (fl->ifl_size-1); + prefetch(&fl->ifl_sds.ifsd_map[next]); + map = fl->ifl_sds.ifsd_map[cidx]; + di = fl->ifl_ifdi; + next = (cidx + CACHE_LINE_SIZE) & (fl->ifl_size-1); + prefetch(&fl->ifl_sds.ifsd_flags[next]); + bus_dmamap_sync(di->idi_tag, di->idi_map, + BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE); /* not valid assert if bxe really does SGE from non-contiguous elements */ - MPASS(fl->ifl_cidx == cidx); - if (unload) - bus_dmamap_unload(fl->ifl_desc_tag, sd->ifsd_map); - + MPASS(fl->ifl_cidx == cidx); + if (unload) + bus_dmamap_unload(fl->ifl_desc_tag, map); + } if (__predict_false(++fl->ifl_cidx == fl->ifl_size)) { fl->ifl_cidx = 0; fl->ifl_gen = 0; @@ -2029,35 +2090,38 @@ rxd_frag_to_sd(iflib_rxq_t rxq, if_rxd_frag_t irf, int *cltype, int unload) /* YES ick */ if (cltype) *cltype = fl->ifl_cltype; - return (sd); + *pfl = fl; + *pcidx = cidx; } static struct mbuf * assemble_segments(iflib_rxq_t rxq, if_rxd_info_t ri) { int i, padlen , flags, cltype; - struct mbuf *m, *mh, *mt; - iflib_rxsd_t sd; - caddr_t cl; + struct mbuf *m, *mh, *mt, *sd_m; + iflib_fl_t fl; + int cidx; + caddr_t cl, sd_cl; i = 0; mh = NULL; do { - sd = rxd_frag_to_sd(rxq, &ri->iri_frags[i], &cltype, TRUE); + rxd_frag_to_sd(rxq, &ri->iri_frags[i], &cltype, TRUE, &fl, &cidx); + sd_m = fl->ifl_sds.ifsd_m[cidx]; + sd_cl = fl->ifl_sds.ifsd_cl[cidx]; - MPASS(sd->ifsd_cl != NULL); - MPASS(sd->ifsd_m != NULL); + MPASS(sd_cl != NULL); + MPASS(sd_m != NULL); /* Don't include zero-length frags */ if (ri->iri_frags[i].irf_len == 0) { /* XXX we can save the cluster here, but not the mbuf */ - m_init(sd->ifsd_m, M_NOWAIT, MT_DATA, 0); - m_free(sd->ifsd_m); - sd->ifsd_m = NULL; + m_init(sd_m, M_NOWAIT, MT_DATA, 0); + m_free(sd_m); + fl->ifl_sds.ifsd_m[cidx] = NULL; continue; } - - m = sd->ifsd_m; + m = sd_m; if (mh == NULL) { flags = M_PKTHDR|M_EXT; mh = mt = m; @@ -2069,9 +2133,9 @@ assemble_segments(iflib_rxq_t rxq, if_rxd_info_t ri) /* assuming padding is only on the first fragment */ padlen = 0; } - sd->ifsd_m = NULL; - cl = sd->ifsd_cl; - sd->ifsd_cl = NULL; + fl->ifl_sds.ifsd_m[cidx] = NULL; + cl = fl->ifl_sds.ifsd_cl[cidx]; + fl->ifl_sds.ifsd_cl[cidx] = NULL; /* Can these two be made one ? */ m_init(m, M_NOWAIT, MT_DATA, flags); @@ -2094,16 +2158,19 @@ static struct mbuf * iflib_rxd_pkt_get(iflib_rxq_t rxq, if_rxd_info_t ri) { struct mbuf *m; - iflib_rxsd_t sd; + iflib_fl_t fl; + caddr_t sd_cl; + int cidx; /* should I merge this back in now that the two paths are basically duplicated? */ if (ri->iri_nfrags == 1 && ri->iri_frags[0].irf_len <= IFLIB_RX_COPY_THRESH) { - sd = rxd_frag_to_sd(rxq, &ri->iri_frags[0], NULL, FALSE); - m = sd->ifsd_m; - sd->ifsd_m = NULL; + rxd_frag_to_sd(rxq, &ri->iri_frags[0], NULL, FALSE, &fl, &cidx); + m = fl->ifl_sds.ifsd_m[cidx]; + fl->ifl_sds.ifsd_m[cidx] = NULL; + sd_cl = fl->ifl_sds.ifsd_cl[cidx]; m_init(m, M_NOWAIT, MT_DATA, M_PKTHDR); - memcpy(m->m_data, sd->ifsd_cl, ri->iri_len); + memcpy(m->m_data, sd_cl, ri->iri_len); m->m_len = ri->iri_frags[0].irf_len; } else { m = assemble_segments(rxq, ri); @@ -4781,12 +4848,9 @@ iflib_msix_init(if_ctx_t ctx) ** successfully initialize us. */ { - uint16_t pci_cmd_word; int msix_ctrl, rid; - pci_cmd_word = pci_read_config(dev, PCIR_COMMAND, 2); - pci_cmd_word |= PCIM_CMD_BUSMASTEREN; - pci_write_config(dev, PCIR_COMMAND, pci_cmd_word, 2); + pci_enable_busmaster(dev); rid = 0; if (pci_find_cap(dev, PCIY_MSIX, &rid) == 0 && rid != 0) { rid += PCIR_MSIX_CTRL; diff --git a/sys/net/iflib.h b/sys/net/iflib.h index a2f8fcc7d33a..9c8a8c95e13e 100644 --- a/sys/net/iflib.h +++ b/sys/net/iflib.h @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2014-2015, Matthew Macy (mmacy@nextbsd.org) + * Copyright (c) 2014-2017, Matthew Macy (mmacy@nextbsd.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/sys/netinet/tcp_syncache.c b/sys/netinet/tcp_syncache.c index 725d821e4bca..2eba51d64269 100644 --- a/sys/netinet/tcp_syncache.c +++ b/sys/netinet/tcp_syncache.c @@ -120,6 +120,14 @@ SYSCTL_INT(_net_inet_tcp, OID_AUTO, syncookies_only, CTLFLAG_VNET | CTLFLAG_RW, &VNET_NAME(tcp_syncookiesonly), 0, "Use only TCP SYN cookies"); +static VNET_DEFINE(int, functions_inherit_listen_socket_stack) = 1; +#define V_functions_inherit_listen_socket_stack \ + VNET(functions_inherit_listen_socket_stack) +SYSCTL_INT(_net_inet_tcp, OID_AUTO, functions_inherit_listen_socket_stack, + CTLFLAG_VNET | CTLFLAG_RW, + &VNET_NAME(functions_inherit_listen_socket_stack), 0, + "Inherit listen socket's stack"); + #ifdef TCP_OFFLOAD #define ADDED_BY_TOE(sc) ((sc)->sc_tod != NULL) #endif @@ -830,7 +838,7 @@ syncache_socket(struct syncache *sc, struct socket *lso, struct mbuf *m) tcp_rcvseqinit(tp); tcp_sendseqinit(tp); blk = sototcpcb(lso)->t_fb; - if (blk != tp->t_fb) { + if (V_functions_inherit_listen_socket_stack && blk != tp->t_fb) { /* * Our parents t_fb was not the default, * we need to release our ref on tp->t_fb and diff --git a/sys/netinet6/in6.c b/sys/netinet6/in6.c index 5a43d5005363..4ecd376f4c3b 100644 --- a/sys/netinet6/in6.c +++ b/sys/netinet6/in6.c @@ -1962,7 +1962,6 @@ in6_if2idlen(struct ifnet *ifp) case IFT_ETHER: /* RFC2464 */ case IFT_PROPVIRTUAL: /* XXX: no RFC. treat it as ether */ case IFT_L2VLAN: /* ditto */ - case IFT_IEEE80211: /* ditto */ case IFT_BRIDGE: /* bridge(4) only does Ethernet-like links */ case IFT_INFINIBAND: return (64); diff --git a/sys/netinet6/in6_ifattach.c b/sys/netinet6/in6_ifattach.c index 6c282ce9db2b..03abc4018bda 100644 --- a/sys/netinet6/in6_ifattach.c +++ b/sys/netinet6/in6_ifattach.c @@ -276,7 +276,6 @@ found: case IFT_ISO88025: case IFT_ATM: case IFT_IEEE1394: - case IFT_IEEE80211: /* IEEE802/EUI64 cases - what others? */ /* IEEE1394 uses 16byte length address starting with EUI64 */ if (addrlen > 8) diff --git a/sys/netinet6/nd6.c b/sys/netinet6/nd6.c index ebaaedcd5f8d..aa46c1ae7bfb 100644 --- a/sys/netinet6/nd6.c +++ b/sys/netinet6/nd6.c @@ -2259,7 +2259,6 @@ nd6_resolve(struct ifnet *ifp, int is_gw, struct mbuf *m, case IFT_ETHER: case IFT_FDDI: case IFT_L2VLAN: - case IFT_IEEE80211: case IFT_BRIDGE: case IFT_ISO88025: ETHER_MAP_IPV6_MULTICAST(&dst6->sin6_addr, @@ -2527,7 +2526,6 @@ nd6_need_cache(struct ifnet *ifp) case IFT_FDDI: case IFT_IEEE1394: case IFT_L2VLAN: - case IFT_IEEE80211: case IFT_INFINIBAND: case IFT_BRIDGE: case IFT_PROPVIRTUAL: diff --git a/sys/netinet6/nd6_nbr.c b/sys/netinet6/nd6_nbr.c index eaa18d439a55..6f246db88dfc 100644 --- a/sys/netinet6/nd6_nbr.c +++ b/sys/netinet6/nd6_nbr.c @@ -1086,7 +1086,6 @@ nd6_ifptomac(struct ifnet *ifp) case IFT_FDDI: case IFT_IEEE1394: case IFT_L2VLAN: - case IFT_IEEE80211: case IFT_INFINIBAND: case IFT_BRIDGE: case IFT_ISO88025: @@ -1457,7 +1456,6 @@ nd6_dad_duplicated(struct ifaddr *ifa, struct dadq *dp) case IFT_FDDI: case IFT_ATM: case IFT_IEEE1394: - case IFT_IEEE80211: case IFT_INFINIBAND: in6 = ia->ia_addr.sin6_addr; if (in6_get_hw_ifid(ifp, &in6) == 0 && diff --git a/sys/netpfil/pf/pf.c b/sys/netpfil/pf/pf.c index f8acce55d978..627133ce221f 100644 --- a/sys/netpfil/pf/pf.c +++ b/sys/netpfil/pf/pf.c @@ -129,6 +129,8 @@ VNET_DEFINE(int, pf_tcp_secret_init); #define V_pf_tcp_secret_init VNET(pf_tcp_secret_init) VNET_DEFINE(int, pf_tcp_iss_off); #define V_pf_tcp_iss_off VNET(pf_tcp_iss_off) +VNET_DECLARE(int, pf_vnet_active); +#define V_pf_vnet_active VNET(pf_vnet_active) /* * Queue for pf_intr() sends. @@ -1441,6 +1443,12 @@ pf_purge_thread(void *unused __unused) kproc_exit(0); } + /* Wait while V_pf_default_rule.timeout is initialized. */ + if (V_pf_vnet_active == 0) { + CURVNET_RESTORE(); + continue; + } + /* Process 1/interval fraction of the state table every run. */ idx = pf_purge_expired_states(idx, pf_hashmask / (V_pf_default_rule.timeout[PFTM_INTERVAL] * 10)); diff --git a/sys/pc98/apm/apm_bioscall.S b/sys/pc98/apm/apm_bioscall.S deleted file mode 100644 index fa42734a7cbf..000000000000 --- a/sys/pc98/apm/apm_bioscall.S +++ /dev/null @@ -1,87 +0,0 @@ -/*- - * Copyright (c) 1997 Jonathan Lemon - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * $FreeBSD$ - */ - -/* - * Functions for calling x86 BIOS functions from the BSD kernel - */ - -#include <machine/asmacros.h> - - .text - -/* - * bios32_apm98(regs, offset, segment) - * struct bios_regs *regs; - * u_int offset; - * u_short segment; - */ -ENTRY(bios32_apm98) - pushl %ebp - movl 16(%esp),%ebp - mov %bp,bioscall_vector+4 - movl 12(%esp),%ebp - movl %ebp,bioscall_vector - movl 8(%esp),%ebp - pushl %ebx - pushl %esi - pushl %edi - movl 0(%ebp),%eax - movl 4(%ebp),%ebx - movl 8(%ebp),%ecx - movl 12(%ebp),%edx - movl 16(%ebp),%esi - movl 20(%ebp),%edi - pushl %ebp - pushfl - cli - lcall *bioscall_vector - movl %eax,%edi - movl %edx,%esi - lahf - movl apm_necsmm_addr,%edx - andl %edx,%edx - jz 9f - inb %dx,%al - andl apm_necsmm_mask,%eax - outb %al,%dx -9: - sti - popl %ebp - movl %edi,0(%ebp) - movl %ebx,4(%ebp) - movl %ecx,8(%ebp) - movl %esi,12(%ebp) - movl $0,16(%ebp) /* esi is cannot get */ - movl $0,20(%ebp) /* edi is cannot get */ - movl %edi,%eax - andl $0x100,%eax - popl %edi - popl %esi - popl %ebx - popl %ebp - ret diff --git a/sys/pc98/cbus/30line.h b/sys/pc98/cbus/30line.h deleted file mode 100644 index c2e0f107a260..000000000000 --- a/sys/pc98/cbus/30line.h +++ /dev/null @@ -1,130 +0,0 @@ -/*- - * Copyright (c) 1994, 1995, 1996. FreeBSD(98) porting team. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer as - * the first lines of this file unmodified. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD$ - */ - -#ifndef __PC98_PC98_30LINE_H__ -#define __PC98_PC98_30LINE_H__ - -#define LINE30_ROW 30 -#define _HS 1 + 1 -#define _VS 2 -#define _HFP 3 + 1 -#define _HBP 14 + 1 -#define _VFP 11 -#define _VBP 44 - -#define _CR 80 -#define _LF LINE30_ROW*16 - -#define _GDC_RESET 0x00 -#define _GDC_SYNC 0x0e -#define _GDC_MASTER 0x6f -#define _GDC_SLAVE 0x6e -#define _GDC_START 0x0d -#define _GDC_STOP 0x0c -#define _GDC_SCROLL 0x70 -#define _GDC_PITCH 0x47 - -#define GDC_CR 0 -#define GDC_VS 1 -#define GDC_HS 2 -#define GDC_HFP 3 -#define GDC_HBP 4 -#define GDC_VFP 5 -#define GDC_VBP 6 -#define GDC_LF 7 - - -#define _24KHZ 0 -#define _31KHZ 1 - -#define _2_5MHZ 0 -#define _5MHZ 1 - -#define _25L 0 -#define _30L 1 - -#define T25_G400 0 -#define T30_G400 1 -#define T30_G480 2 - -static void master_gdc_cmd(unsigned int); -static void master_gdc_prm(unsigned int); -static void master_gdc_word_prm(unsigned int); -#ifdef LINE30 -static void master_gdc_fifo_empty(void); -#endif -static void master_gdc_wait_vsync(void); - -static void gdc_cmd(unsigned int); -#ifdef LINE30 -static void gdc_prm(unsigned int); -static void gdc_word_prm(unsigned int); -static void gdc_fifo_empty(void); -#endif -static void gdc_wait_vsync(void); - -#ifdef LINE30 -static int check_gdc_clock(void); - -static int gdc_INFO = _25L; -#endif -static int gdc_FH = _24KHZ; -static void initialize_gdc(unsigned int, int); - -#ifdef LINE30 -static unsigned int master_param[2][2][8] = { -{{78, 8, 7, 9, 7, 7, 25, 400}, /* 400/24k */ - {_CR-2, _VS, _HS-1, _HFP-1, _HBP-1, _VFP, _VBP, _LF}}, /* 480/24k */ -{{78, 2, 7, 3, 7, 13, 34, 400}, /* 400/31k */ - {78, 2, 11, 3, 3, 6, 37, 480}}}; /* 480/31k */ - -static unsigned int slave_param[2][6][8] = { -{{38, 8, 3, 4, 3, 7, 25, 400}, /* normal */ - {78, 8, 7, 9, 7, 7, 25, 400}, - {_CR/2-2, _VS, (_HS)/2-1, (_HFP)/2-1, (_HBP)/2-1, - _VFP+(_LF-400)/2+8, _VBP+(_LF-400)/2-8, 400}, /* 30 & 400 */ - {_CR-2, _VS, _HS-1, _HFP-1, _HBP-1, - _VFP+(_LF-400)/2+8, _VBP+(_LF-400)/2-8, 400}, - {_CR/2-2, _VS, (_HS)/2-1, (_HFP)/2-1, (_HBP)/2-1, - _VFP, _VBP, _LF}, /* 30 & 480 */ - {_CR-2, _VS, _HS-1, _HFP-1, _HBP-1, _VFP, _VBP, _LF}}, -{{38, 2, 3, 1, 3, 13, 34, 400}, /* normal */ - {78, 2, 7, 3, 7, 13, 34, 400}, - {38, 2, 5, 1, 1, 6+48, 37+32, 400}, /* 30 & 400 */ - {78, 2, 11, 3, 3, 6+48, 37+32, 400}, - {38, 2, 5, 1, 1, 6, 37, 480}, /* 30 & 480 */ - {78, 2, 11, 3, 3, 6, 37, 480}}}; - -static int SlavePCH[2] = {40,80}; -static int MasterPCH = 80; -static int SlaveScrlLF[3] = {400,400,_LF}; -#endif - -#endif /* __PC98_PC98_30LINE_H__ */ diff --git a/sys/pc98/cbus/cbus.h b/sys/pc98/cbus/cbus.h deleted file mode 100644 index 302245f896f6..000000000000 --- a/sys/pc98/cbus/cbus.h +++ /dev/null @@ -1,63 +0,0 @@ -/*- - * Copyright (c) 1990 The Regents of the University of California. - * All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * William Jolitz. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * from: @(#)isa.h 5.7 (Berkeley) 5/9/91 - * $FreeBSD$ - */ - -#ifndef _PC98_PC98_PC98_H_ -#define _PC98_PC98_PC98_H_ - -/* - * PC98 Bus conventions - * modified for PC9801 by A.Kojima F.Ukai M.Ishii - * Kyoto University Microcomputer Club (KMC) - */ - -/* - * Input / Output Port Assignments -- PC98 IO address ... very dirty (^_^; - */ - -#define IO_ICU1 0x000 /* 8259A Interrupt Controller #1 */ -#define IO_ICU2 0x008 /* 8259A Interrupt Controller #2 */ -#define IO_RTC 0x020 /* 4990A RTC */ -#define IO_SYSPORT 0x031 /* 8255A System Port */ -#define IO_KBD 0x041 /* 8251A Keyboard */ -#define IO_COM2 0x0B1 /* 8251A RS232C serial I/O (ext) */ -#define IO_COM3 0x0B9 /* 8251A RS232C serial I/O (ext) */ -#define IO_FDPORT 0x0BE /* FD I/F port (1M<->640K,EMTON) */ - -/* - * Input / Output Port Sizes - */ -#define IO_KBDSIZE 16 /* 8042 Keyboard controllers */ - -#endif /* !_PC98_PC98_PC98_H_ */ diff --git a/sys/pc98/cbus/cbus_dma.c b/sys/pc98/cbus/cbus_dma.c deleted file mode 100644 index 02d9d0c67ae3..000000000000 --- a/sys/pc98/cbus/cbus_dma.c +++ /dev/null @@ -1,534 +0,0 @@ -/*- - * Copyright (c) 1991 The Regents of the University of California. - * All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * William Jolitz. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * from: @(#)isa.c 7.2 (Berkeley) 5/13/91 - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -/* - * code to manage AT bus - * - * 92/08/18 Frank P. MacLachlan (fpm@crash.cts.com): - * Fixed uninitialized variable problem and added code to deal - * with DMA page boundaries in isa_dmarangecheck(). Fixed word - * mode DMA count compution and reorganized DMA setup code in - * isa_dmastart() - */ - -#include "opt_pc98.h" - -#include <sys/param.h> -#include <sys/systm.h> -#include <sys/bus.h> -#include <sys/kernel.h> -#include <sys/malloc.h> -#include <sys/lock.h> -#include <sys/proc.h> -#include <sys/mutex.h> -#include <sys/module.h> -#include <machine/md_var.h> -#include <vm/vm.h> -#include <vm/vm_param.h> -#include <vm/pmap.h> -#include <isa/isavar.h> -#include <pc98/cbus/cbus.h> -#include <pc98/cbus/cbus_dmareg.h> - -static int isa_dmarangecheck(caddr_t va, u_int length, int chan); - -static caddr_t dma_bouncebuf[4]; -static u_int dma_bouncebufsize[4]; -static u_int8_t dma_bounced = 0; -static u_int8_t dma_busy = 0; /* Used in isa_dmastart() */ -static u_int8_t dma_inuse = 0; /* User for acquire/release */ -static u_int8_t dma_auto_mode = 0; -static struct mtx isa_dma_lock; -MTX_SYSINIT(isa_dma_lock, &isa_dma_lock, "isa DMA lock", MTX_DEF); - -#define VALID_DMA_MASK (3) - -/* high byte of address is stored in this port for i-th dma channel */ -static int dmapageport[4] = { 0x27, 0x21, 0x23, 0x25 }; - -/* - * Setup a DMA channel's bounce buffer. - */ -int -isa_dma_init(int chan, u_int bouncebufsize, int flag) -{ - void *buf; - -#ifdef DIAGNOSTIC - if (chan & ~VALID_DMA_MASK) - panic("isa_dma_init: channel out of range"); - if (dma_bouncebuf[chan] != NULL) - panic("isa_dma_init: impossible request"); -#endif - - - /* Try malloc() first. It works better if it works. */ - buf = malloc(bouncebufsize, M_DEVBUF, flag); - if (buf != NULL) { - if (isa_dmarangecheck(buf, bouncebufsize, chan) != 0) { - free(buf, M_DEVBUF); - buf = NULL; - } - } - - if (buf == NULL) { - buf = contigmalloc(bouncebufsize, M_DEVBUF, flag, 0ul, 0xfffffful, - 1ul, chan & 4 ? 0x20000ul : 0x10000ul); - } - - if (buf == NULL) - return (ENOMEM); - - mtx_lock(&isa_dma_lock); - - dma_bouncebufsize[chan] = bouncebufsize; - dma_bouncebuf[chan] = buf; - - mtx_unlock(&isa_dma_lock); - - return (0); -} - -/* - * Register a DMA channel's usage. Usually called from a device driver - * in open() or during its initialization. - */ -int -isa_dma_acquire(chan) - int chan; -{ -#ifdef DIAGNOSTIC - if (chan & ~VALID_DMA_MASK) - panic("isa_dma_acquire: channel out of range"); -#endif - - mtx_lock(&isa_dma_lock); - if (dma_inuse & (1 << chan)) { - printf("isa_dma_acquire: channel %d already in use\n", chan); - mtx_unlock(&isa_dma_lock); - return (EBUSY); - } - dma_inuse |= (1 << chan); - dma_auto_mode &= ~(1 << chan); - mtx_unlock(&isa_dma_lock); - - return (0); -} - -/* - * Unregister a DMA channel's usage. Usually called from a device driver - * during close() or during its shutdown. - */ -void -isa_dma_release(chan) - int chan; -{ -#ifdef DIAGNOSTIC - if (chan & ~VALID_DMA_MASK) - panic("isa_dma_release: channel out of range"); - - mtx_lock(&isa_dma_lock); - if ((dma_inuse & (1 << chan)) == 0) - printf("isa_dma_release: channel %d not in use\n", chan); -#else - mtx_lock(&isa_dma_lock); -#endif - - if (dma_busy & (1 << chan)) { - dma_busy &= ~(1 << chan); - /* - * XXX We should also do "dma_bounced &= (1 << chan);" - * because we are acting on behalf of isa_dmadone() which - * was not called to end the last DMA operation. This does - * not matter now, but it may in the future. - */ - } - - dma_inuse &= ~(1 << chan); - dma_auto_mode &= ~(1 << chan); - - mtx_unlock(&isa_dma_lock); -} - -/* - * isa_dmastart(): program 8237 DMA controller channel, avoid page alignment - * problems by using a bounce buffer. - */ -void -isa_dmastart(int flags, caddr_t addr, u_int nbytes, int chan) -{ - vm_paddr_t phys; - int waport; - caddr_t newaddr; - int dma_range_checked; - - /* translate to physical */ - phys = pmap_extract(kernel_pmap, (vm_offset_t)addr); - dma_range_checked = isa_dmarangecheck(addr, nbytes, chan); - -#ifdef DIAGNOSTIC - if (chan & ~VALID_DMA_MASK) - panic("isa_dmastart: channel out of range"); - - if ((chan < 4 && nbytes > (1<<16)) - || (chan >= 4 && (nbytes > (1<<17) || (u_int)addr & 1))) - panic("isa_dmastart: impossible request"); - - mtx_lock(&isa_dma_lock); - if ((dma_inuse & (1 << chan)) == 0) - printf("isa_dmastart: channel %d not acquired\n", chan); -#else - mtx_lock(&isa_dma_lock); -#endif - -#if 0 - /* - * XXX This should be checked, but drivers like ad1848 only call - * isa_dmastart() once because they use Auto DMA mode. If we - * leave this in, drivers that do this will print this continuously. - */ - if (dma_busy & (1 << chan)) - printf("isa_dmastart: channel %d busy\n", chan); -#endif - - dma_busy |= (1 << chan); - - if (dma_range_checked) { - if (dma_bouncebuf[chan] == NULL - || dma_bouncebufsize[chan] < nbytes) - panic("isa_dmastart: bad bounce buffer"); - dma_bounced |= (1 << chan); - newaddr = dma_bouncebuf[chan]; - - /* copy bounce buffer on write */ - if (!(flags & ISADMA_READ)) - bcopy(addr, newaddr, nbytes); - addr = newaddr; - } - - if (flags & ISADMA_RAW) { - dma_auto_mode |= (1 << chan); - } else { - dma_auto_mode &= ~(1 << chan); - } - - if (need_pre_dma_flush) - wbinvd(); /* wbinvd (WB cache flush) */ - - /* set dma channel mode, and reset address ff */ - - /* If ISADMA_RAW flag is set, then use autoinitialise mode */ - if (flags & ISADMA_RAW) { - if (flags & ISADMA_READ) - outb(DMA1_MODE, DMA37MD_AUTO|DMA37MD_WRITE|chan); - else - outb(DMA1_MODE, DMA37MD_AUTO|DMA37MD_READ|chan); - } else { - if (flags & ISADMA_READ) - outb(DMA1_MODE, DMA37MD_SINGLE|DMA37MD_WRITE|chan); - else - outb(DMA1_MODE, DMA37MD_SINGLE|DMA37MD_READ|chan); - } - outb(DMA1_FFC, 0); - - /* send start address */ - waport = DMA1_CHN(chan); - outb(waport, phys); - outb(waport, phys>>8); - outb(dmapageport[chan], phys>>16); - - /* send count */ - outb(waport + 2, --nbytes); - outb(waport + 2, nbytes>>8); - - /* unmask channel */ - outb(DMA1_SMSK, chan); - - mtx_unlock(&isa_dma_lock); -} - -void -isa_dmadone(int flags, caddr_t addr, int nbytes, int chan) -{ - - if (flags & ISADMA_READ) { - /* cache flush only after reading 92/12/9 by A.Kojima */ - if (need_post_dma_flush) - invd(); - } - -#ifdef DIAGNOSTIC - if (chan & ~VALID_DMA_MASK) - panic("isa_dmadone: channel out of range"); - - if ((dma_inuse & (1 << chan)) == 0) - printf("isa_dmadone: channel %d not acquired\n", chan); -#endif - - mtx_lock(&isa_dma_lock); - if (((dma_busy & (1 << chan)) == 0) && - (dma_auto_mode & (1 << chan)) == 0 ) - printf("isa_dmadone: channel %d not busy\n", chan); - - if ((dma_auto_mode & (1 << chan)) == 0) - outb(DMA1_SMSK, (chan & 3) | 4); - - if (dma_bounced & (1 << chan)) { - /* copy bounce buffer on read */ - if (flags & ISADMA_READ) - bcopy(dma_bouncebuf[chan], addr, nbytes); - - dma_bounced &= ~(1 << chan); - } - dma_busy &= ~(1 << chan); - mtx_unlock(&isa_dma_lock); -} - -/* - * Check for problems with the address range of a DMA transfer - * (non-contiguous physical pages, outside of bus address space, - * crossing DMA page boundaries). - * Return true if special handling needed. - */ - -static int -isa_dmarangecheck(caddr_t va, u_int length, int chan) -{ - vm_paddr_t phys, priorpage = 0; - vm_offset_t endva; - u_int dma_pgmsk = (chan & 4) ? ~(128*1024-1) : ~(64*1024-1); - - endva = (vm_offset_t)round_page((vm_offset_t)va + length); - for (; va < (caddr_t) endva ; va += PAGE_SIZE) { - phys = trunc_page(pmap_extract(kernel_pmap, (vm_offset_t)va)); -#ifdef EPSON_BOUNCEDMA -#define ISARAM_END 0x0f00000 -#else -#define ISARAM_END 0x1000000 -#endif - if (phys == 0) - panic("isa_dmacheck: no physical page present"); - if (phys >= ISARAM_END) - return (1); - if (priorpage) { - if (priorpage + PAGE_SIZE != phys) - return (1); - /* check if crossing a DMA page boundary */ - if (((u_int)priorpage ^ (u_int)phys) & dma_pgmsk) - return (1); - } - priorpage = phys; - } - return (0); -} - -/* - * Query the progress of a transfer on a DMA channel. - * - * To avoid having to interrupt a transfer in progress, we sample - * each of the high and low databytes twice, and apply the following - * logic to determine the correct count. - * - * Reads are performed with interrupts disabled, thus it is to be - * expected that the time between reads is very small. At most - * one rollover in the low count byte can be expected within the - * four reads that are performed. - * - * There are three gaps in which a rollover can occur : - * - * - read low1 - * gap1 - * - read high1 - * gap2 - * - read low2 - * gap3 - * - read high2 - * - * If a rollover occurs in gap1 or gap2, the low2 value will be - * greater than the low1 value. In this case, low2 and high2 are a - * corresponding pair. - * - * In any other case, low1 and high1 can be considered to be correct. - * - * The function returns the number of bytes remaining in the transfer, - * or -1 if the channel requested is not active. - * - */ -static int -isa_dmastatus_locked(int chan) -{ - u_long cnt = 0; - int ffport, waport; - u_long low1, high1, low2, high2; - - mtx_assert(&isa_dma_lock, MA_OWNED); - - /* channel active? */ - if ((dma_inuse & (1 << chan)) == 0) { - printf("isa_dmastatus: channel %d not active\n", chan); - return(-1); - } - /* channel busy? */ - - if (((dma_busy & (1 << chan)) == 0) && - (dma_auto_mode & (1 << chan)) == 0 ) { - printf("chan %d not busy\n", chan); - return -2 ; - } - ffport = DMA1_FFC; - waport = DMA1_CHN(chan) + 2; - - disable_intr(); /* no interrupts Mr Jones! */ - outb(ffport, 0); /* clear register LSB flipflop */ - low1 = inb(waport); - high1 = inb(waport); - outb(ffport, 0); /* clear again */ - low2 = inb(waport); - high2 = inb(waport); - enable_intr(); /* enable interrupts again */ - - /* - * Now decide if a wrap has tried to skew our results. - * Note that after TC, the count will read 0xffff, while we want - * to return zero, so we add and then mask to compensate. - */ - if (low1 >= low2) { - cnt = (low1 + (high1 << 8) + 1) & 0xffff; - } else { - cnt = (low2 + (high2 << 8) + 1) & 0xffff; - } - - if (chan >= 4) /* high channels move words */ - cnt *= 2; - return(cnt); -} - -int -isa_dmastatus(int chan) -{ - int status; - - mtx_lock(&isa_dma_lock); - status = isa_dmastatus_locked(chan); - mtx_unlock(&isa_dma_lock); - - return (status); -} - -/* - * Reached terminal count yet ? - */ -int -isa_dmatc(int chan) -{ - - return(inb(DMA1_STATUS) & (1 << chan)); -} - -/* - * Stop a DMA transfer currently in progress. - */ -int -isa_dmastop(int chan) -{ - int status; - - mtx_lock(&isa_dma_lock); - if ((dma_inuse & (1 << chan)) == 0) - printf("isa_dmastop: channel %d not acquired\n", chan); - - if (((dma_busy & (1 << chan)) == 0) && - ((dma_auto_mode & (1 << chan)) == 0)) { - printf("chan %d not busy\n", chan); - mtx_unlock(&isa_dma_lock); - return -2 ; - } - - if ((chan & 4) == 0) - outb(DMA1_SMSK, (chan & 3) | 4 /* disable mask */); - - status = isa_dmastatus_locked(chan); - - mtx_unlock(&isa_dma_lock); - - return (status); -} - -/* - * Attach to the ISA PnP descriptor for the AT DMA controller - */ -static struct isa_pnp_id atdma_ids[] = { - { 0x0002d041 /* PNP0200 */, "AT DMA controller" }, - { 0 } -}; - -static int -atdma_probe(device_t dev) -{ - int result; - - if ((result = ISA_PNP_PROBE(device_get_parent(dev), dev, atdma_ids)) <= 0) - device_quiet(dev); - return(result); -} - -static int -atdma_attach(device_t dev) -{ - return(0); -} - -static device_method_t atdma_methods[] = { - /* Device interface */ - DEVMETHOD(device_probe, atdma_probe), - DEVMETHOD(device_attach, atdma_attach), - DEVMETHOD(device_detach, bus_generic_detach), - DEVMETHOD(device_shutdown, bus_generic_shutdown), - DEVMETHOD(device_suspend, bus_generic_suspend), - DEVMETHOD(device_resume, bus_generic_resume), - { 0, 0 } -}; - -static driver_t atdma_driver = { - "atdma", - atdma_methods, - 1, /* no softc */ -}; - -static devclass_t atdma_devclass; - -DRIVER_MODULE(atdma, isa, atdma_driver, atdma_devclass, 0, 0); diff --git a/sys/pc98/cbus/cbus_dmareg.h b/sys/pc98/cbus/cbus_dmareg.h deleted file mode 100644 index 9401b916560e..000000000000 --- a/sys/pc98/cbus/cbus_dmareg.h +++ /dev/null @@ -1,44 +0,0 @@ -/*- - * Copyright (C) 2005 TAKAHASHI Yoshihiro. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * $FreeBSD$ - */ - -#ifndef _PC98_CBUS_CBUS_DMAREG_H_ -#define _PC98_CBUS_CBUS_DMAREG_H_ - -#include <dev/ic/i8237.h> - -#define IO_DMA 0x01 /* 8237A DMA Controller */ - -/* - * Register definitions for DMA controller 1 (channels 0..3): - */ -#define DMA1_CHN(c) (IO_DMA + (4*(c))) /* addr reg for channel c */ -#define DMA1_STATUS (IO_DMA + 0x10) /* status register */ -#define DMA1_SMSK (IO_DMA + 0x14) /* single mask register */ -#define DMA1_MODE (IO_DMA + 0x16) /* mode register */ -#define DMA1_FFC (IO_DMA + 0x18) /* clear first/last FF */ - -#endif /* _PC98_CBUS_CBUS_DMAREG_H_ */ diff --git a/sys/pc98/cbus/gdc.c b/sys/pc98/cbus/gdc.c deleted file mode 100644 index 4fff4cebaf07..000000000000 --- a/sys/pc98/cbus/gdc.c +++ /dev/null @@ -1,1487 +0,0 @@ -/*- - * Copyright (c) 1999 FreeBSD(98) port team. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer as - * the first lines of this file unmodified. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD$ - */ - -#include "opt_gdc.h" -#include "opt_fb.h" -#include "opt_syscons.h" - -#include <sys/param.h> -#include <sys/systm.h> -#include <sys/kernel.h> -#include <sys/module.h> -#include <sys/conf.h> -#include <sys/bus.h> -#include <machine/bus.h> -#include <sys/rman.h> -#include <machine/resource.h> - -#include <sys/fbio.h> -#include <sys/fcntl.h> - -#include <vm/vm.h> -#include <vm/pmap.h> -#include <vm/vm_param.h> - -#include <machine/md_var.h> -#include <machine/pc/bios.h> - -#include <dev/fb/fbreg.h> - -#ifdef LINE30 -#include <pc98/cbus/cbus.h> -#endif -#include <pc98/pc98/pc98_machdep.h> -#include <isa/isavar.h> - -#define TEXT_GDC 0x60 -#define GRAPHIC_GDC 0xa0 -#define ROW 25 -#define COL 80 - -#define DRIVER_NAME "gdc" - -/* cdev driver declaration */ - -#define GDC_UNIT(dev) dev2unit(dev) -#define GDC_MKMINOR(unit) (unit) - -typedef struct gdc_softc { - video_adapter_t *adp; - struct resource *res_tgdc, *res_ggdc; - struct resource *res_egc, *res_pegc, *res_grcg, *res_kcg; - struct resource *res_tmem, *res_gmem1, *res_gmem2; -#ifdef FB_INSTALL_CDEV - genfb_softc_t gensc; -#endif -} gdc_softc_t; - -#define GDC_SOFTC(unit) \ - ((gdc_softc_t *)devclass_get_softc(gdc_devclass, unit)) - -static bus_addr_t gdc_iat[] = {0, 2, 4, 6, 8, 10, 12, 14}; - -static devclass_t gdc_devclass; - -static int gdc_probe_unit(int unit, gdc_softc_t *sc, int flags); -static int gdc_attach_unit(int unit, gdc_softc_t *sc, int flags); -static int gdc_alloc_resource(device_t dev); -static int gdc_release_resource(device_t dev); - -#ifdef FB_INSTALL_CDEV - -static d_open_t gdcopen; -static d_close_t gdcclose; -static d_read_t gdcread; -static d_write_t gdcwrite; -static d_ioctl_t gdcioctl; -static d_mmap_t gdcmmap; - -static struct cdevsw gdc_cdevsw = { - .d_version = D_VERSION, - .d_flags = D_NEEDGIANT, - .d_open = gdcopen, - .d_close = gdcclose, - .d_read = gdcread, - .d_write = gdcwrite, - .d_ioctl = gdcioctl, - .d_mmap = gdcmmap, - .d_name = DRIVER_NAME, -}; - -#endif /* FB_INSTALL_CDEV */ - -static void -gdc_identify(driver_t *driver, device_t parent) -{ - BUS_ADD_CHILD(parent, ISA_ORDER_SPECULATIVE, DRIVER_NAME, 0); -} - -static int -gdcprobe(device_t dev) -{ - int error; - - /* Check isapnp ids */ - if (isa_get_vendorid(dev)) - return (ENXIO); - - device_set_desc(dev, "Generic GDC"); - - error = gdc_alloc_resource(dev); - if (error) - return (error); - - error = gdc_probe_unit(device_get_unit(dev), - device_get_softc(dev), - device_get_flags(dev)); - - gdc_release_resource(dev); - - return (error); -} - -static int -gdc_attach(device_t dev) -{ - gdc_softc_t *sc; - int error; - - error = gdc_alloc_resource(dev); - if (error) - return (error); - - sc = device_get_softc(dev); - error = gdc_attach_unit(device_get_unit(dev), - sc, - device_get_flags(dev)); - if (error) { - gdc_release_resource(dev); - return error; - } - -#ifdef FB_INSTALL_CDEV - /* attach a virtual frame buffer device */ - error = fb_attach(GDC_MKMINOR(device_get_unit(dev)), - sc->adp, &gdc_cdevsw); - if (error) { - gdc_release_resource(dev); - return error; - } -#endif /* FB_INSTALL_CDEV */ - - if (bootverbose) - vidd_diag(sc->adp, bootverbose); - - return 0; -} - -static int -gdc_probe_unit(int unit, gdc_softc_t *sc, int flags) -{ - video_switch_t *sw; - - sw = vid_get_switch(DRIVER_NAME); - if (sw == NULL) - return ENXIO; - return (*sw->probe)(unit, &sc->adp, NULL, flags); -} - -static int -gdc_attach_unit(int unit, gdc_softc_t *sc, int flags) -{ - video_switch_t *sw; - - sw = vid_get_switch(DRIVER_NAME); - if (sw == NULL) - return ENXIO; - return (*sw->init)(unit, sc->adp, flags); -} - - -static int -gdc_alloc_resource(device_t dev) -{ - int rid; - gdc_softc_t *sc; - - sc = device_get_softc(dev); - - /* TEXT GDC */ - rid = 0; - bus_set_resource(dev, SYS_RES_IOPORT, rid, TEXT_GDC, 1); - sc->res_tgdc = isa_alloc_resourcev(dev, SYS_RES_IOPORT, &rid, - gdc_iat, 8, RF_ACTIVE); - if (sc->res_tgdc == NULL) { - gdc_release_resource(dev); - return (ENXIO); - } - isa_load_resourcev(sc->res_tgdc, gdc_iat, 8); - - /* GRAPHIC GDC */ - rid = 8; - bus_set_resource(dev, SYS_RES_IOPORT, rid, GRAPHIC_GDC, 1); - sc->res_ggdc = isa_alloc_resourcev(dev, SYS_RES_IOPORT, &rid, - gdc_iat, 8, RF_ACTIVE); - if (sc->res_ggdc == NULL) { - gdc_release_resource(dev); - return (ENXIO); - } - isa_load_resourcev(sc->res_ggdc, gdc_iat, 8); - - /* EGC */ - rid = 16; - bus_set_resource(dev, SYS_RES_IOPORT, rid, 0x4a0, 1); - sc->res_egc = isa_alloc_resourcev(dev, SYS_RES_IOPORT, &rid, - gdc_iat, 8, RF_ACTIVE); - if (sc->res_egc == NULL) { - gdc_release_resource(dev); - return (ENXIO); - } - isa_load_resourcev(sc->res_egc, gdc_iat, 8); - - /* PEGC */ - rid = 24; - bus_set_resource(dev, SYS_RES_IOPORT, rid, 0x9a0, 1); - sc->res_pegc = isa_alloc_resourcev(dev, SYS_RES_IOPORT, &rid, - gdc_iat, 8, RF_ACTIVE); - if (sc->res_pegc == NULL) { - gdc_release_resource(dev); - return (ENXIO); - } - isa_load_resourcev(sc->res_pegc, gdc_iat, 8); - - /* CRTC/GRCG */ - rid = 32; - bus_set_resource(dev, SYS_RES_IOPORT, rid, 0x70, 1); - sc->res_grcg = isa_alloc_resourcev(dev, SYS_RES_IOPORT, &rid, - gdc_iat, 8, RF_ACTIVE); - if (sc->res_grcg == NULL) { - gdc_release_resource(dev); - return (ENXIO); - } - isa_load_resourcev(sc->res_grcg, gdc_iat, 8); - - /* KCG */ - rid = 40; - bus_set_resource(dev, SYS_RES_IOPORT, rid, 0xa1, 1); - sc->res_kcg = isa_alloc_resourcev(dev, SYS_RES_IOPORT, &rid, - gdc_iat, 8, RF_ACTIVE); - if (sc->res_kcg == NULL) { - gdc_release_resource(dev); - return (ENXIO); - } - isa_load_resourcev(sc->res_kcg, gdc_iat, 8); - - - /* TEXT Memory */ - rid = 0; - sc->res_tmem = bus_alloc_resource(dev, SYS_RES_MEMORY, &rid, - 0xa0000, 0xa4fff, 0x5000, RF_ACTIVE); - if (sc->res_tmem == NULL) { - gdc_release_resource(dev); - return (ENXIO); - } - - /* GRAPHIC Memory */ - rid = 1; - sc->res_gmem1 = bus_alloc_resource(dev, SYS_RES_MEMORY, &rid, - 0xa8000, 0xbffff, 0x18000, - RF_ACTIVE); - if (sc->res_gmem1 == NULL) { - gdc_release_resource(dev); - return (ENXIO); - } - rid = 2; - sc->res_gmem2 = bus_alloc_resource(dev, SYS_RES_MEMORY, &rid, - 0xe0000, 0xe7fff, 0x8000, - RF_ACTIVE); - if (sc->res_gmem2 == NULL) { - gdc_release_resource(dev); - return (ENXIO); - } - - return (0); -} - -static int -gdc_release_resource(device_t dev) -{ - gdc_softc_t *sc; - - sc = device_get_softc(dev); - - if (sc->res_tgdc) - bus_release_resource(dev, SYS_RES_IOPORT, 0, sc->res_tgdc); - if (sc->res_ggdc) - bus_release_resource(dev, SYS_RES_IOPORT, 8, sc->res_ggdc); - if (sc->res_egc) - bus_release_resource(dev, SYS_RES_IOPORT, 16, sc->res_egc); - if (sc->res_pegc) - bus_release_resource(dev, SYS_RES_IOPORT, 24, sc->res_pegc); - if (sc->res_grcg) - bus_release_resource(dev, SYS_RES_IOPORT, 32, sc->res_grcg); - if (sc->res_kcg) - bus_release_resource(dev, SYS_RES_IOPORT, 40, sc->res_kcg); - - if (sc->res_tmem) - bus_release_resource(dev, SYS_RES_MEMORY, 0, sc->res_tmem); - if (sc->res_gmem1) - bus_release_resource(dev, SYS_RES_MEMORY, 1, sc->res_gmem1); - if (sc->res_gmem2) - bus_release_resource(dev, SYS_RES_MEMORY, 2, sc->res_gmem2); - - return (0); -} - -/* cdev driver functions */ - -#ifdef FB_INSTALL_CDEV - -static int -gdcopen(struct cdev *dev, int flag, int mode, struct thread *td) -{ - gdc_softc_t *sc; - - sc = GDC_SOFTC(GDC_UNIT(dev)); - if (sc == NULL) - return ENXIO; - if (mode & (O_CREAT | O_APPEND | O_TRUNC)) - return ENODEV; - - return genfbopen(&sc->gensc, sc->adp, flag, mode, td); -} - -static int -gdcclose(struct cdev *dev, int flag, int mode, struct thread *td) -{ - gdc_softc_t *sc; - - sc = GDC_SOFTC(GDC_UNIT(dev)); - return genfbclose(&sc->gensc, sc->adp, flag, mode, td); -} - -static int -gdcread(struct cdev *dev, struct uio *uio, int flag) -{ - gdc_softc_t *sc; - - sc = GDC_SOFTC(GDC_UNIT(dev)); - return genfbread(&sc->gensc, sc->adp, uio, flag); -} - -static int -gdcwrite(struct cdev *dev, struct uio *uio, int flag) -{ - gdc_softc_t *sc; - - sc = GDC_SOFTC(GDC_UNIT(dev)); - return genfbread(&sc->gensc, sc->adp, uio, flag); -} - -static int -gdcioctl(struct cdev *dev, u_long cmd, caddr_t arg, int flag, struct thread *td) -{ - gdc_softc_t *sc; - - sc = GDC_SOFTC(GDC_UNIT(dev)); - return genfbioctl(&sc->gensc, sc->adp, cmd, arg, flag, td); -} - -static int -gdcmmap(struct cdev *dev, vm_ooffset_t offset, vm_paddr_t *paddr, - int prot, vm_memattr_t *memattr) -{ - gdc_softc_t *sc; - - sc = GDC_SOFTC(GDC_UNIT(dev)); - return genfbmmap(&sc->gensc, sc->adp, offset, paddr, prot, memattr); -} - -#endif /* FB_INSTALL_CDEV */ - -static device_method_t gdc_methods[] = { - DEVMETHOD(device_identify, gdc_identify), - DEVMETHOD(device_probe, gdcprobe), - DEVMETHOD(device_attach, gdc_attach), - { 0, 0 } -}; - -static driver_t gdcdriver = { - DRIVER_NAME, - gdc_methods, - sizeof(gdc_softc_t), -}; - -DRIVER_MODULE(gdc, isa, gdcdriver, gdc_devclass, 0, 0); - -/* LOW-LEVEL */ - - -#include <pc98/cbus/30line.h> - -#define TEXT_BUF_BASE 0x000a0000 -#define TEXT_BUF_SIZE 0x00008000 -#define GRAPHICS_BUF_BASE 0x000a8000 -#define GRAPHICS_BUF_SIZE 0x00040000 -#define VIDEO_BUF_BASE 0x000a0000 -#define VIDEO_BUF_SIZE 0x00048000 - -#define probe_done(adp) ((adp)->va_flags & V_ADP_PROBED) -#define init_done(adp) ((adp)->va_flags & V_ADP_INITIALIZED) -#define config_done(adp) ((adp)->va_flags & V_ADP_REGISTERED) - -/* - * NOTE: `va_window' should have a virtual address, but is initialized - * with a physical address in the following table, they will be - * converted at run-time. - */ -static video_adapter_t adapter_init_value[] = { - { 0, - KD_PC98, "gdc", /* va_type, va_name */ - 0, 0, /* va_unit, va_minor */ - V_ADP_COLOR | V_ADP_MODECHANGE | V_ADP_BORDER, - TEXT_GDC, 16, TEXT_GDC, /* va_io*, XXX */ - VIDEO_BUF_BASE, VIDEO_BUF_SIZE, /* va_mem* */ - TEXT_BUF_BASE, TEXT_BUF_SIZE, TEXT_BUF_SIZE, 0, /* va_window* */ - 0, 0, /* va_buffer, va_buffer_size */ - 0, M_PC98_80x25, 0, /* va_*mode* */ - }, -}; - -static video_adapter_t biosadapter[1]; - -/* video driver declarations */ -static int gdc_configure(int flags); -static int gdc_err(video_adapter_t *adp, ...); -static vi_probe_t gdc_probe; -static vi_init_t gdc_init; -static vi_get_info_t gdc_get_info; -static vi_query_mode_t gdc_query_mode; -static vi_set_mode_t gdc_set_mode; -static vi_set_border_t gdc_set_border; -static vi_save_state_t gdc_save_state; -static vi_load_state_t gdc_load_state; -static vi_read_hw_cursor_t gdc_read_hw_cursor; -static vi_set_hw_cursor_t gdc_set_hw_cursor; -static vi_set_hw_cursor_shape_t gdc_set_hw_cursor_shape; -static vi_blank_display_t gdc_blank_display; -static vi_mmap_t gdc_mmap_buf; -static vi_ioctl_t gdc_dev_ioctl; -static vi_clear_t gdc_clear; -static vi_fill_rect_t gdc_fill_rect; -static vi_bitblt_t gdc_bitblt; -static vi_diag_t gdc_diag; -static vi_save_palette_t gdc_save_palette; -static vi_load_palette_t gdc_load_palette; -static vi_set_win_org_t gdc_set_origin; - -static video_switch_t gdcvidsw = { - gdc_probe, - gdc_init, - gdc_get_info, - gdc_query_mode, - gdc_set_mode, - (vi_save_font_t *)gdc_err, - (vi_load_font_t *)gdc_err, - (vi_show_font_t *)gdc_err, - gdc_save_palette, - gdc_load_palette, - gdc_set_border, - gdc_save_state, - gdc_load_state, - gdc_set_origin, - gdc_read_hw_cursor, - gdc_set_hw_cursor, - gdc_set_hw_cursor_shape, - gdc_blank_display, - gdc_mmap_buf, - gdc_dev_ioctl, - gdc_clear, - gdc_fill_rect, - gdc_bitblt, - (int (*)(void))gdc_err, - (int (*)(void))gdc_err, - gdc_diag, -}; - -VIDEO_DRIVER(gdc, gdcvidsw, gdc_configure); - -/* GDC BIOS standard video modes */ -#define EOT (-1) -#define NA (-2) - -static video_info_t bios_vmode[] = { - { M_PC98_80x25, V_INFO_COLOR, 80, 25, 8, 16, 4, 1, - TEXT_BUF_BASE, TEXT_BUF_SIZE, TEXT_BUF_SIZE, 0, 0, V_INFO_MM_TEXT }, -#ifdef LINE30 - { M_PC98_80x30, V_INFO_COLOR, 80, 30, 8, 16, 4, 1, - TEXT_BUF_BASE, TEXT_BUF_SIZE, TEXT_BUF_SIZE, 0, 0, V_INFO_MM_TEXT }, -#endif -#ifndef GDC_NOGRAPHICS - { M_PC98_EGC640x400, V_INFO_COLOR | V_INFO_GRAPHICS, - 640, 400, 8, 16, 4, 4, - GRAPHICS_BUF_BASE, GRAPHICS_BUF_SIZE, GRAPHICS_BUF_SIZE, 0, 0, - V_INFO_MM_PLANAR }, - { M_PC98_PEGC640x400, V_INFO_COLOR | V_INFO_GRAPHICS | V_INFO_VESA, - 640, 400, 8, 16, 8, 1, - GRAPHICS_BUF_BASE, 0x00008000, 0x00008000, 0, 0, - V_INFO_MM_PACKED, 1 }, -#ifdef LINE30 - { M_PC98_PEGC640x480, V_INFO_COLOR | V_INFO_GRAPHICS | V_INFO_VESA, - 640, 480, 8, 16, 8, 1, - GRAPHICS_BUF_BASE, 0x00008000, 0x00008000, 0, 0, - V_INFO_MM_PACKED, 1 }, -#endif -#endif - { EOT }, -}; - -static int gdc_init_done = FALSE; - -/* local functions */ -static int map_gen_mode_num(int type, int color, int mode); -static int probe_adapters(void); - -#define prologue(adp, flag, err) \ - if (!gdc_init_done || !((adp)->va_flags & (flag))) \ - return (err) - -/* a backdoor for the console driver */ -static int -gdc_configure(int flags) -{ - probe_adapters(); - biosadapter[0].va_flags |= V_ADP_INITIALIZED; - if (!config_done(&biosadapter[0])) { - if (vid_register(&biosadapter[0]) < 0) - return 1; - biosadapter[0].va_flags |= V_ADP_REGISTERED; - } - - return 1; -} - -/* local subroutines */ - -/* map a generic video mode to a known mode number */ -static int -map_gen_mode_num(int type, int color, int mode) -{ - static struct { - int from; - int to; - } mode_map[] = { - { M_TEXT_80x25, M_PC98_80x25, }, -#ifdef LINE30 - { M_TEXT_80x30, M_PC98_80x30, }, -#endif - }; - int i; - - for (i = 0; i < nitems(mode_map); ++i) { - if (mode_map[i].from == mode) - return mode_map[i].to; - } - return mode; -} - -static int -verify_adapter(video_adapter_t *adp) -{ -#ifndef GDC_NOGRAPHICS - int i; - - if (PC98_SYSTEM_PARAMETER(0x45c) & 0x40) { /* PEGC exists */ - adp->va_flags |= V_ADP_VESA; /* XXX */ - } else { - for (i = 0; bios_vmode[i].vi_mode != EOT; ++i) { - if (bios_vmode[i].vi_flags & V_INFO_VESA) - bios_vmode[i].vi_mode = NA; - } - } -#endif - return 0; -} - -/* probe video adapters and return the number of detected adapters */ -static int -probe_adapters(void) -{ - video_info_t info; - - /* do this test only once */ - if (gdc_init_done) - return 1; - gdc_init_done = TRUE; - - biosadapter[0] = adapter_init_value[0]; - biosadapter[0].va_flags |= V_ADP_PROBED; - biosadapter[0].va_mode = - biosadapter[0].va_initial_mode = biosadapter[0].va_initial_bios_mode; - - if ((PC98_SYSTEM_PARAMETER(0x597) & 0x80) || - (PC98_SYSTEM_PARAMETER(0x458) & 0x80)) { - gdc_FH = (inb(0x9a8) & 1) ? _31KHZ : _24KHZ; - } else { - gdc_FH = _24KHZ; - } - - gdc_get_info(&biosadapter[0], biosadapter[0].va_initial_mode, &info); - initialize_gdc(T25_G400, info.vi_flags & V_INFO_GRAPHICS); - - biosadapter[0].va_window = BIOS_PADDRTOVADDR(info.vi_window); - biosadapter[0].va_window_size = info.vi_window_size; - biosadapter[0].va_window_gran = info.vi_window_gran; - biosadapter[0].va_buffer = 0; - biosadapter[0].va_buffer_size = 0; - if (info.vi_flags & V_INFO_GRAPHICS) { - switch (info.vi_depth/info.vi_planes) { - case 1: - biosadapter[0].va_line_width = info.vi_width/8; - break; - case 2: - biosadapter[0].va_line_width = info.vi_width/4; - break; - case 4: - biosadapter[0].va_line_width = info.vi_width/2; - break; - case 8: - default: /* shouldn't happen */ - biosadapter[0].va_line_width = info.vi_width; - break; - } - } else { - biosadapter[0].va_line_width = info.vi_width; - } - bcopy(&info, &biosadapter[0].va_info, sizeof(info)); - - verify_adapter(&biosadapter[0]); - - return 1; -} - -static void master_gdc_cmd(unsigned int cmd) -{ - while ( (inb(TEXT_GDC) & 2) != 0); - outb(TEXT_GDC+2, cmd); -} - -static void master_gdc_prm(unsigned int pmtr) -{ - while ( (inb(TEXT_GDC) & 2) != 0); - outb(TEXT_GDC, pmtr); -} - -static void master_gdc_word_prm(unsigned int wpmtr) -{ - master_gdc_prm(wpmtr & 0x00ff); - master_gdc_prm((wpmtr >> 8) & 0x00ff); -} - -#ifdef LINE30 -static void master_gdc_fifo_empty(void) -{ - while ( (inb(TEXT_GDC) & 4) == 0); -} -#endif - -static void master_gdc_wait_vsync(void) -{ - while ( (inb(TEXT_GDC) & 0x20) != 0); - while ( (inb(TEXT_GDC) & 0x20) == 0); -} - -static void gdc_cmd(unsigned int cmd) -{ - while ( (inb(GRAPHIC_GDC) & 2) != 0); - outb( GRAPHIC_GDC+2, cmd); -} - -#ifdef LINE30 -static void gdc_prm(unsigned int pmtr) -{ - while ( (inb(GRAPHIC_GDC) & 2) != 0); - outb( GRAPHIC_GDC, pmtr); -} - -static void gdc_word_prm(unsigned int wpmtr) -{ - gdc_prm(wpmtr & 0x00ff); - gdc_prm((wpmtr >> 8) & 0x00ff); -} - -static void gdc_fifo_empty(void) -{ - while ( (inb(GRAPHIC_GDC) & 0x04) == 0); -} -#endif - -static void gdc_wait_vsync(void) -{ - while ( (inb(GRAPHIC_GDC) & 0x20) != 0); - while ( (inb(GRAPHIC_GDC) & 0x20) == 0); -} - -#ifdef LINE30 -static int check_gdc_clock(void) -{ - if ((inb(IO_SYSPORT) & 0x80) == 0){ - return _5MHZ; - } else { - return _2_5MHZ; - } -} -#endif - -static void initialize_gdc(unsigned int mode, int isGraph) -{ -#ifdef LINE30 - /* start 30line initialize */ - int m_mode, s_mode, gdc_clock, hsync_clock; - - gdc_clock = check_gdc_clock(); - m_mode = (mode == T25_G400) ? _25L : _30L; - s_mode = 2*mode+gdc_clock; - gdc_INFO = m_mode; - - master_gdc_wait_vsync(); - - if ((PC98_SYSTEM_PARAMETER(0x597) & 0x80) || - (PC98_SYSTEM_PARAMETER(0x458) & 0x80)) { - if (PC98_SYSTEM_PARAMETER(0x481) & 0x08) { - hsync_clock = (m_mode == _25L) ? gdc_FH : _31KHZ; - outb(0x9a8, (hsync_clock == _31KHZ) ? 1 : 0); - } else { - hsync_clock = gdc_FH; - } - } else { - hsync_clock = _24KHZ; - } - - if ((gdc_clock == _2_5MHZ) && - (slave_param[hsync_clock][s_mode][GDC_LF] > 400)) { - outb(0x6a, 0x83); - outb(0x6a, 0x85); - gdc_clock = _5MHZ; - s_mode = 2*mode+gdc_clock; - } - - master_gdc_cmd(_GDC_RESET); - master_gdc_cmd(_GDC_MASTER); - gdc_cmd(_GDC_RESET); - gdc_cmd(_GDC_SLAVE); - - /* GDC Master */ - master_gdc_cmd(_GDC_SYNC); - master_gdc_prm(0x00); /* flush less */ /* text & graph */ - master_gdc_prm(master_param[hsync_clock][m_mode][GDC_CR]); - master_gdc_word_prm(((master_param[hsync_clock][m_mode][GDC_HFP] << 10) - + (master_param[hsync_clock][m_mode][GDC_VS] << 5) - + master_param[hsync_clock][m_mode][GDC_HS])); - master_gdc_prm(master_param[hsync_clock][m_mode][GDC_HBP]); - master_gdc_prm(master_param[hsync_clock][m_mode][GDC_VFP]); - master_gdc_word_prm(((master_param[hsync_clock][m_mode][GDC_VBP] << 10) - + (master_param[hsync_clock][m_mode][GDC_LF]))); - master_gdc_fifo_empty(); - master_gdc_cmd(_GDC_PITCH); - master_gdc_prm(MasterPCH); - master_gdc_fifo_empty(); - - /* GDC slave */ - gdc_cmd(_GDC_SYNC); - gdc_prm(0x06); - gdc_prm(slave_param[hsync_clock][s_mode][GDC_CR]); - gdc_word_prm((slave_param[hsync_clock][s_mode][GDC_HFP] << 10) - + (slave_param[hsync_clock][s_mode][GDC_VS] << 5) - + (slave_param[hsync_clock][s_mode][GDC_HS])); - gdc_prm(slave_param[hsync_clock][s_mode][GDC_HBP]); - gdc_prm(slave_param[hsync_clock][s_mode][GDC_VFP]); - gdc_word_prm((slave_param[hsync_clock][s_mode][GDC_VBP] << 10) - + (slave_param[hsync_clock][s_mode][GDC_LF])); - gdc_fifo_empty(); - gdc_cmd(_GDC_PITCH); - gdc_prm(SlavePCH[gdc_clock]); - gdc_fifo_empty(); - - /* set Master GDC scroll param */ - master_gdc_wait_vsync(); - master_gdc_wait_vsync(); - master_gdc_wait_vsync(); - master_gdc_cmd(_GDC_SCROLL); - master_gdc_word_prm(0); - master_gdc_word_prm((master_param[hsync_clock][m_mode][GDC_LF] << 4) - | 0x0000); - master_gdc_fifo_empty(); - - /* set Slave GDC scroll param */ - gdc_wait_vsync(); - gdc_cmd(_GDC_SCROLL); - gdc_word_prm(0); - if (gdc_clock == _5MHZ) { - gdc_word_prm((SlaveScrlLF[mode] << 4) | 0x4000); - } else { - gdc_word_prm(SlaveScrlLF[mode] << 4); - } - gdc_fifo_empty(); - - gdc_word_prm(0); - if (gdc_clock == _5MHZ) { - gdc_word_prm((SlaveScrlLF[mode] << 4) | 0x4000); - } else { - gdc_word_prm(SlaveScrlLF[mode] << 4); - } - gdc_fifo_empty(); - - /* sync start */ - gdc_cmd(isGraph ? _GDC_START : _GDC_STOP); - - gdc_wait_vsync(); - gdc_wait_vsync(); - gdc_wait_vsync(); - - master_gdc_cmd(isGraph ? _GDC_STOP : _GDC_START); -#else - master_gdc_wait_vsync(); - master_gdc_cmd(isGraph ? _GDC_STOP : _GDC_START); /* text */ - gdc_wait_vsync(); - gdc_cmd(isGraph ? _GDC_START : _GDC_STOP); /* graphics */ -#endif -} - -#ifndef GDC_NOGRAPHICS -static u_char b_palette[] = { - /* R G B */ - 0x00, 0x00, 0x00, /* 0 */ - 0x00, 0x00, 0x7f, /* 1 */ - 0x7f, 0x00, 0x00, /* 2 */ - 0x7f, 0x00, 0x7f, /* 3 */ - 0x00, 0x7f, 0x00, /* 4 */ - 0x00, 0x7f, 0x7f, /* 5 */ - 0x7f, 0x7f, 0x00, /* 6 */ - 0x7f, 0x7f, 0x7f, /* 7 */ - 0x40, 0x40, 0x40, /* 8 */ - 0x00, 0x00, 0xff, /* 9 */ - 0xff, 0x00, 0x00, /* 10 */ - 0xff, 0x00, 0xff, /* 11 */ - 0x00, 0xff, 0x00, /* 12 */ - 0x00, 0xff, 0xff, /* 13 */ - 0xff, 0xff, 0x00, /* 14 */ - 0xff, 0xff, 0xff, /* 15 */ -}; -#endif - -static int -gdc_load_palette(video_adapter_t *adp, u_char *palette) -{ -#ifndef GDC_NOGRAPHICS - int i; - - if (adp->va_info.vi_flags & V_INFO_VESA) { - gdc_wait_vsync(); - for (i = 0; i < 256; ++i) { - outb(0xa8, i); - outb(0xac, *palette++); /* R */ - outb(0xaa, *palette++); /* G */ - outb(0xae, *palette++); /* B */ - } - } else { - /* - * XXX - Even though PC-98 text color is independent of palette, - * we should set palette in text mode. - * Because the background color of text mode is palette 0's one. - */ - outb(0x6a, 1); /* 16 colors mode */ - bcopy(palette, b_palette, sizeof(b_palette)); - - gdc_wait_vsync(); - for (i = 0; i < 16; ++i) { - outb(0xa8, i); - outb(0xac, *palette++ >> 4); /* R */ - outb(0xaa, *palette++ >> 4); /* G */ - outb(0xae, *palette++ >> 4); /* B */ - } - } -#endif - return 0; -} - -static int -gdc_save_palette(video_adapter_t *adp, u_char *palette) -{ -#ifndef GDC_NOGRAPHICS - int i; - - if (adp->va_info.vi_flags & V_INFO_VESA) { - for (i = 0; i < 256; ++i) { - outb(0xa8, i); - *palette++ = inb(0xac); /* R */ - *palette++ = inb(0xaa); /* G */ - *palette++ = inb(0xae); /* B */ - } - } else { - bcopy(b_palette, palette, sizeof(b_palette)); - } -#endif - return 0; -} - -static int -gdc_set_origin(video_adapter_t *adp, off_t offset) -{ -#ifndef GDC_NOGRAPHICS - if (adp->va_info.vi_flags & V_INFO_VESA) { - writew(BIOS_PADDRTOVADDR(0x000e0004), offset >> 15); - } -#endif - return 0; -} - -/* entry points */ - -static int -gdc_err(video_adapter_t *adp, ...) -{ - return ENODEV; -} - -static int -gdc_probe(int unit, video_adapter_t **adpp, void *arg, int flags) -{ - probe_adapters(); - if (unit >= 1) - return ENXIO; - - *adpp = &biosadapter[unit]; - - return 0; -} - -static int -gdc_init(int unit, video_adapter_t *adp, int flags) -{ - if ((unit >= 1) || (adp == NULL) || !probe_done(adp)) - return ENXIO; - - if (!init_done(adp)) { - /* nothing to do really... */ - adp->va_flags |= V_ADP_INITIALIZED; - } - - if (!config_done(adp)) { - if (vid_register(adp) < 0) - return ENXIO; - adp->va_flags |= V_ADP_REGISTERED; - } - - return 0; -} - -/* - * get_info(): - * Return the video_info structure of the requested video mode. - */ -static int -gdc_get_info(video_adapter_t *adp, int mode, video_info_t *info) -{ - int i; - - if (!gdc_init_done) - return ENXIO; - - mode = map_gen_mode_num(adp->va_type, adp->va_flags & V_ADP_COLOR, mode); - for (i = 0; bios_vmode[i].vi_mode != EOT; ++i) { - if (bios_vmode[i].vi_mode == NA) - continue; - if (mode == bios_vmode[i].vi_mode) { - *info = bios_vmode[i]; - info->vi_buffer_size = info->vi_window_size*info->vi_planes; - return 0; - } - } - return EINVAL; -} - -/* - * query_mode(): - * Find a video mode matching the requested parameters. - * Fields filled with 0 are considered "don't care" fields and - * match any modes. - */ -static int -gdc_query_mode(video_adapter_t *adp, video_info_t *info) -{ - int i; - - if (!gdc_init_done) - return ENXIO; - - for (i = 0; bios_vmode[i].vi_mode != EOT; ++i) { - if (bios_vmode[i].vi_mode == NA) - continue; - - if ((info->vi_width != 0) - && (info->vi_width != bios_vmode[i].vi_width)) - continue; - if ((info->vi_height != 0) - && (info->vi_height != bios_vmode[i].vi_height)) - continue; - if ((info->vi_cwidth != 0) - && (info->vi_cwidth != bios_vmode[i].vi_cwidth)) - continue; - if ((info->vi_cheight != 0) - && (info->vi_cheight != bios_vmode[i].vi_cheight)) - continue; - if ((info->vi_depth != 0) - && (info->vi_depth != bios_vmode[i].vi_depth)) - continue; - if ((info->vi_planes != 0) - && (info->vi_planes != bios_vmode[i].vi_planes)) - continue; - /* XXX: should check pixel format, memory model */ - if ((info->vi_flags != 0) - && (info->vi_flags != bios_vmode[i].vi_flags)) - continue; - - /* verify if this mode is supported on this adapter */ - if (gdc_get_info(adp, bios_vmode[i].vi_mode, info)) - continue; - return 0; - } - return ENODEV; -} - -/* - * set_mode(): - * Change the video mode. - */ -static int -gdc_set_mode(video_adapter_t *adp, int mode) -{ - video_info_t info; - - prologue(adp, V_ADP_MODECHANGE, ENODEV); - - mode = map_gen_mode_num(adp->va_type, - adp->va_flags & V_ADP_COLOR, mode); - if (gdc_get_info(adp, mode, &info)) - return EINVAL; - - switch (info.vi_mode) { -#ifndef GDC_NOGRAPHICS - case M_PC98_PEGC640x480: /* PEGC 640x480 */ - initialize_gdc(T30_G480, info.vi_flags & V_INFO_GRAPHICS); - break; - case M_PC98_PEGC640x400: /* PEGC 640x400 */ - case M_PC98_EGC640x400: /* EGC GRAPHICS */ -#endif - case M_PC98_80x25: /* VGA TEXT */ - initialize_gdc(T25_G400, info.vi_flags & V_INFO_GRAPHICS); - break; - case M_PC98_80x30: /* VGA TEXT */ - initialize_gdc(T30_G400, info.vi_flags & V_INFO_GRAPHICS); - break; - default: - break; - } - -#ifndef GDC_NOGRAPHICS - if (info.vi_flags & V_INFO_VESA) { - outb(0x6a, 0x07); /* enable mode F/F change */ - outb(0x6a, 0x21); /* enhanced graphics */ - if (info.vi_height > 400) - outb(0x6a, 0x69); /* 800 lines */ - writeb(BIOS_PADDRTOVADDR(0x000e0100), 0); /* packed pixel */ - } else { - if (adp->va_flags & V_ADP_VESA) { - outb(0x6a, 0x07); /* enable mode F/F change */ - outb(0x6a, 0x20); /* normal graphics */ - outb(0x6a, 0x68); /* 400 lines */ - } - outb(0x6a, 1); /* 16 colors */ - } -#endif - - adp->va_mode = mode; - adp->va_flags &= ~V_ADP_COLOR; - adp->va_flags |= - (info.vi_flags & V_INFO_COLOR) ? V_ADP_COLOR : 0; -#if 0 - adp->va_crtc_addr = - (adp->va_flags & V_ADP_COLOR) ? COLOR_CRTC : MONO_CRTC; -#endif - adp->va_window = BIOS_PADDRTOVADDR(info.vi_window); - adp->va_window_size = info.vi_window_size; - adp->va_window_gran = info.vi_window_gran; - if (info.vi_buffer_size == 0) { - adp->va_buffer = 0; - adp->va_buffer_size = 0; - } else { - adp->va_buffer = BIOS_PADDRTOVADDR(info.vi_buffer); - adp->va_buffer_size = info.vi_buffer_size; - } - if (info.vi_flags & V_INFO_GRAPHICS) { - switch (info.vi_depth/info.vi_planes) { - case 1: - adp->va_line_width = info.vi_width/8; - break; - case 2: - adp->va_line_width = info.vi_width/4; - break; - case 4: - adp->va_line_width = info.vi_width/2; - break; - case 8: - default: /* shouldn't happen */ - adp->va_line_width = info.vi_width; - break; - } - } else { - adp->va_line_width = info.vi_width; - } - bcopy(&info, &adp->va_info, sizeof(info)); - - /* move hardware cursor out of the way */ - vidd_set_hw_cursor(adp, -1, -1); - - return 0; -} - -/* - * set_border(): - * Change the border color. - */ -static int -gdc_set_border(video_adapter_t *adp, int color) -{ - outb(0x6c, color << 4); - return 0; -} - -/* - * save_state(): - * Read video card register values. - */ -static int -gdc_save_state(video_adapter_t *adp, void *p, size_t size) -{ - return ENODEV; -} - -/* - * load_state(): - * Set video card registers at once. - */ -static int -gdc_load_state(video_adapter_t *adp, void *p) -{ - return ENODEV; -} - -/* - * read_hw_cursor(): - * Read the position of the hardware text cursor. - */ -static int -gdc_read_hw_cursor(video_adapter_t *adp, int *col, int *row) -{ - u_int16_t off; - int s; - - if (!gdc_init_done) - return ENXIO; - - if (adp->va_info.vi_flags & V_INFO_GRAPHICS) - return ENODEV; - - s = spltty(); - master_gdc_cmd(0xe0); /* _GDC_CSRR */ - while((inb(TEXT_GDC + 0) & 0x1) == 0) {} /* GDC wait */ - off = inb(TEXT_GDC + 2); /* EADl */ - off |= (inb(TEXT_GDC + 2) << 8); /* EADh */ - inb(TEXT_GDC + 2); /* dummy */ - inb(TEXT_GDC + 2); /* dummy */ - inb(TEXT_GDC + 2); /* dummy */ - splx(s); - - if (off >= ROW*COL) - off = 0; - *row = off / adp->va_info.vi_width; - *col = off % adp->va_info.vi_width; - - return 0; -} - -/* - * set_hw_cursor(): - * Move the hardware text cursor. If col and row are both -1, - * the cursor won't be shown. - */ -static int -gdc_set_hw_cursor(video_adapter_t *adp, int col, int row) -{ - u_int16_t off; - int s; - - if (!gdc_init_done) - return ENXIO; - - if ((col == -1) && (row == -1)) { - off = -1; - } else { - if (adp->va_info.vi_flags & V_INFO_GRAPHICS) - return ENODEV; - off = row*adp->va_info.vi_width + col; - } - - s = spltty(); - master_gdc_cmd(0x49); /* _GDC_CSRW */ - master_gdc_word_prm(off); - splx(s); - - return 0; -} - -/* - * set_hw_cursor_shape(): - * Change the shape of the hardware text cursor. If the height is zero - * or negative, the cursor won't be shown. - */ -static int -gdc_set_hw_cursor_shape(video_adapter_t *adp, int base, int height, - int celsize, int blink) -{ - int start; - int end; - int s; - - if (!gdc_init_done) - return ENXIO; - - start = celsize - (base + height); - end = celsize - base - 1; - -#if 0 - /* - * muPD7220 GDC has anomaly that if end == celsize - 1 then start - * must be 0, otherwise the cursor won't be correctly shown - * in the first row in the screen. We shall set end to celsize - 2; - * if end == celsize -1 && start > 0. XXX - */ - if ((end == celsize - 1) && (start > 0) && (start < end)) - --end; -#endif - - s = spltty(); - master_gdc_cmd(0x4b); /* _GDC_CSRFORM */ - master_gdc_prm(((height > 0) ? 0x80 : 0) /* cursor on/off */ - | ((celsize - 1) & 0x1f)); /* cel size */ - master_gdc_word_prm(((end & 0x1f) << 11) /* end line */ - | (12 << 6) /* blink rate */ - | (blink ? 0 : 0x20) /* blink on/off */ - | (start & 0x1f)); /* start line */ - splx(s); - - return 0; -} - -/* - * blank_display() - * Put the display in power save/power off mode. - */ -static int -gdc_blank_display(video_adapter_t *adp, int mode) -{ - int s; - static int standby = 0; - - if (!gdc_init_done) - return ENXIO; - - s = splhigh(); - switch (mode) { - case V_DISPLAY_SUSPEND: - case V_DISPLAY_STAND_BY: - outb(0x09a2, 0x80 | 0x40); /* V/H-SYNC mask */ - if (inb(0x09a2) == (0x80 | 0x40)) - standby = 1; - /* FALLTHROUGH */ - - case V_DISPLAY_BLANK: - while (!(inb(TEXT_GDC) & 0x20)) /* V-SYNC wait */ - ; - outb(TEXT_GDC + 8, 0x0e); /* DISP off */ - break; - - case V_DISPLAY_ON: - while (!(inb(TEXT_GDC) & 0x20)) /* V-SYNC wait */ - ; - outb(TEXT_GDC + 8, 0x0f); /* DISP on */ - if (standby) { - outb(0x09a2, 0x00); /* V/H-SYNC unmask */ - standby = 0; - } - break; - } - splx(s); - return 0; -} - -/* - * mmap(): - * Mmap frame buffer. - */ -static int -gdc_mmap_buf(video_adapter_t *adp, vm_ooffset_t offset, vm_offset_t *paddr, - int prot, vm_memattr_t *memattr) -{ - /* FIXME: is this correct? XXX */ - if (offset > VIDEO_BUF_SIZE - PAGE_SIZE) - return -1; - *paddr = adp->va_info.vi_window + offset; - return 0; -} - -#ifndef GDC_NOGRAPHICS -static void -planar_fill(video_adapter_t *adp, int val) -{ - - outb(0x7c, 0x80); /* GRCG on & TDW mode */ - outb(0x7e, 0); /* tile B */ - outb(0x7e, 0); /* tile R */ - outb(0x7e, 0); /* tile G */ - outb(0x7e, 0); /* tile I */ - - fillw_io(0, adp->va_window, 0x8000 / 2); /* XXX */ - - outb(0x7c, 0); /* GRCG off */ -} - -static void -packed_fill(video_adapter_t *adp, int val) -{ - int length; - int at; /* position in the frame buffer */ - int l; - - at = 0; - length = adp->va_line_width*adp->va_info.vi_height; - while (length > 0) { - l = imin(length, adp->va_window_size); - vidd_set_win_org(adp, at); - bzero_io(adp->va_window, l); - length -= l; - at += l; - } -} - -static int -gdc_clear(video_adapter_t *adp) -{ - - switch (adp->va_info.vi_mem_model) { - case V_INFO_MM_TEXT: - /* do nothing? XXX */ - break; - case V_INFO_MM_PLANAR: - planar_fill(adp, 0); - break; - case V_INFO_MM_PACKED: - packed_fill(adp, 0); - break; - } - - return 0; -} -#else /* GDC_NOGRAPHICS */ -static int -gdc_clear(video_adapter_t *adp) -{ - - return 0; -} -#endif /* GDC_NOGRAPHICS */ - -static int -gdc_fill_rect(video_adapter_t *adp, int val, int x, int y, int cx, int cy) -{ - return ENODEV; -} - -static int -gdc_bitblt(video_adapter_t *adp,...) -{ - /* FIXME */ - return ENODEV; -} - -static int -gdc_dev_ioctl(video_adapter_t *adp, u_long cmd, caddr_t arg) -{ - switch (cmd) { - case FBIO_GETWINORG: /* get frame buffer window origin */ - *(u_int *)arg = 0; - return 0; - - case FBIO_SETWINORG: /* set frame buffer window origin */ - case FBIO_SETDISPSTART: /* set display start address */ - case FBIO_SETLINEWIDTH: /* set scan line length in pixel */ - case FBIO_GETPALETTE: /* get color palette */ - case FBIO_SETPALETTE: /* set color palette */ - case FBIOGETCMAP: /* get color palette */ - case FBIOPUTCMAP: /* set color palette */ - return ENODEV; - - case FBIOGTYPE: /* get frame buffer type info. */ - ((struct fbtype *)arg)->fb_type = fb_type(adp->va_type); - ((struct fbtype *)arg)->fb_height = adp->va_info.vi_height; - ((struct fbtype *)arg)->fb_width = adp->va_info.vi_width; - ((struct fbtype *)arg)->fb_depth = adp->va_info.vi_depth; - if ((adp->va_info.vi_depth <= 1) || (adp->va_info.vi_depth > 8)) - ((struct fbtype *)arg)->fb_cmsize = 0; - else - ((struct fbtype *)arg)->fb_cmsize = 1 << adp->va_info.vi_depth; - ((struct fbtype *)arg)->fb_size = adp->va_buffer_size; - return 0; - - default: - return fb_commonioctl(adp, cmd, arg); - } -} - -/* - * diag(): - * Print some information about the video adapter and video modes, - * with requested level of details. - */ -static int -gdc_diag(video_adapter_t *adp, int level) -{ -#if defined(FB_DEBUG) && FB_DEBUG > 1 - int i; -#endif - - if (!gdc_init_done) - return ENXIO; - - fb_dump_adp_info(DRIVER_NAME, adp, level); - -#if defined(FB_DEBUG) && FB_DEBUG > 1 - for (i = 0; bios_vmode[i].vi_mode != EOT; ++i) { - if (bios_vmode[i].vi_mode == NA) - continue; - if (get_mode_param(bios_vmode[i].vi_mode) == NULL) - continue; - fb_dump_mode_info(DRIVER_NAME, adp, &bios_vmode[i], level); - } -#endif - - return 0; -} diff --git a/sys/pc98/cbus/nmi.c b/sys/pc98/cbus/nmi.c deleted file mode 100644 index 16612aa25b44..000000000000 --- a/sys/pc98/cbus/nmi.c +++ /dev/null @@ -1,69 +0,0 @@ -/*- - * Copyright (c) 1991 The Regents of the University of California. - * All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * William Jolitz. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * from: @(#)isa.c 7.2 (Berkeley) 5/13/91 - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#include <sys/types.h> -#include <sys/syslog.h> -#include <sys/systm.h> - -#include <machine/md_var.h> - -#define NMI_PARITY 0x04 -#define NMI_EPARITY 0x02 - -/* - * Handle a NMI, possibly a machine check. - * return true to panic system, false to ignore. - */ -int -isa_nmi(int cd) -{ - int retval = 0; - int port = inb(0x33); - - log(LOG_CRIT, "NMI PC98 port = %x\n", port); - if (port & NMI_PARITY) { - log(LOG_CRIT, "BASE RAM parity error, likely hardware failure."); - retval = 1; - } else if (port & NMI_EPARITY) { - log(LOG_CRIT, "EXTENDED RAM parity error, likely hardware failure."); - retval = 1; - } else { - log(LOG_CRIT, "\nNMI Resume ??\n"); - } - - return(retval); -} diff --git a/sys/pc98/cbus/olpt.c b/sys/pc98/cbus/olpt.c deleted file mode 100644 index 983ec078e213..000000000000 --- a/sys/pc98/cbus/olpt.c +++ /dev/null @@ -1,648 +0,0 @@ -/*- - * Copyright (c) 1990 William F. Jolitz, TeleMuse - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This software is a component of "386BSD" developed by - * William F. Jolitz, TeleMuse. - * 4. Neither the name of the developer nor the name "386BSD" - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS A COMPONENT OF 386BSD DEVELOPED BY WILLIAM F. JOLITZ - * AND IS INTENDED FOR RESEARCH AND EDUCATIONAL PURPOSES ONLY. THIS - * SOFTWARE SHOULD NOT BE CONSIDERED TO BE A COMMERCIAL PRODUCT. - * THE DEVELOPER URGES THAT USERS WHO REQUIRE A COMMERCIAL PRODUCT - * NOT MAKE USE OF THIS WORK. - * - * FOR USERS WHO WISH TO UNDERSTAND THE 386BSD SYSTEM DEVELOPED - * BY WILLIAM F. JOLITZ, WE RECOMMEND THE USER STUDY WRITTEN - * REFERENCES SUCH AS THE "PORTING UNIX TO THE 386" SERIES - * (BEGINNING JANUARY 1991 "DR. DOBBS JOURNAL", USA AND BEGINNING - * JUNE 1991 "UNIX MAGAZIN", GERMANY) BY WILLIAM F. JOLITZ AND - * LYNNE GREER JOLITZ, AS WELL AS OTHER BOOKS ON UNIX AND THE - * ON-LINE 386BSD USER MANUAL BEFORE USE. A BOOK DISCUSSING THE INTERNALS - * OF 386BSD ENTITLED "386BSD FROM THE INSIDE OUT" WILL BE AVAILABLE LATE 1992. - * - * THIS SOFTWARE IS PROVIDED BY THE DEVELOPER ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE DEVELOPER BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * from: unknown origin, 386BSD 0.1 - * $FreeBSD$ - */ - -/* - * Device Driver for AT parallel printer port - * Written by William Jolitz 12/18/90 - */ - -/* - * Parallel port TCP/IP interfaces added. I looked at the driver from - * MACH but this is a complete rewrite, and btw. incompatible, and it - * should perform better too. I have never run the MACH driver though. - * - * This driver sends two bytes (0x08, 0x00) in front of each packet, - * to allow us to distinguish another format later. - * - * Now added a Linux/Crynwr compatibility mode which is enabled using - * IF_LINK0 - Tim Wilkinson. - * - * TODO: - * Make HDLC/PPP mode, use IF_LLC1 to enable. - * - * Connect the two computers using a Laplink parallel cable to use this - * feature: - * - * +----------------------------------------+ - * |A-name A-End B-End Descr. Port/Bit | - * +----------------------------------------+ - * |DATA0 2 15 Data 0/0x01 | - * |-ERROR 15 2 1/0x08 | - * +----------------------------------------+ - * |DATA1 3 13 Data 0/0x02 | - * |+SLCT 13 3 1/0x10 | - * +----------------------------------------+ - * |DATA2 4 12 Data 0/0x04 | - * |+PE 12 4 1/0x20 | - * +----------------------------------------+ - * |DATA3 5 10 Strobe 0/0x08 | - * |-ACK 10 5 1/0x40 | - * +----------------------------------------+ - * |DATA4 6 11 Data 0/0x10 | - * |BUSY 11 6 1/~0x80 | - * +----------------------------------------+ - * |GND 18-25 18-25 GND - | - * +----------------------------------------+ - * - * Expect transfer-rates up to 75 kbyte/sec. - * - * If GCC could correctly grok - * register int port asm("edx") - * the code would be cleaner - * - * Poul-Henning Kamp <phk@freebsd.org> - */ - -#include <sys/param.h> -#include <sys/systm.h> -#include <sys/conf.h> -#include <sys/bus.h> -#include <sys/kernel.h> -#include <sys/module.h> -#include <sys/uio.h> -#include <sys/syslog.h> -#include <sys/malloc.h> - -#include <machine/bus.h> -#include <machine/resource.h> -#include <sys/rman.h> - -#include <isa/isavar.h> - -#include <pc98/cbus/olptreg.h> -#include <dev/ppbus/lptio.h> - -#define LPINITRDY 4 /* wait up to 4 seconds for a ready */ -#define LPTOUTINITIAL 10 /* initial timeout to wait for ready 1/10 s */ -#define LPTOUTMAX 1 /* maximal timeout 1 s */ -#define LPPRI (PZERO+8) -#define BUFSIZE 1024 - -#ifndef DEBUG -#define lprintf(args) -#else -#define lprintf(args) do { \ - if (lptflag) \ - printf args; \ - } while (0) -static int volatile lptflag = 1; -#endif - -struct lpt_softc { - struct resource *res_port; - struct resource *res_irq; - void *sc_ih; - struct callout timer; - - int sc_port; - short sc_state; - /* default case: negative prime, negative ack, handshake strobe, - prime once */ - u_char sc_control; - char sc_flags; -#define LP_POS_INIT 0x04 /* if we are a postive init signal */ -#define LP_POS_ACK 0x08 /* if we are a positive going ack */ -#define LP_NO_PRIME 0x10 /* don't prime the printer at all */ -#define LP_PRIMEOPEN 0x20 /* prime on every open */ -#define LP_AUTOLF 0x40 /* tell printer to do an automatic lf */ -#define LP_BYPASS 0x80 /* bypass printer ready checks */ - void *sc_inbuf; - short sc_xfercnt ; - char sc_primed; - char *sc_cp ; - u_char sc_irq ; /* IRQ status of port */ -#define LP_HAS_IRQ 0x01 /* we have an irq available */ -#define LP_USE_IRQ 0x02 /* we are using our irq */ -#define LP_ENABLE_IRQ 0x04 /* enable IRQ on open */ - u_char sc_backoff ; /* time to call lptout() again */ -}; - -/* bits for state */ -#define OPEN (1<<0) /* device is open */ -#define ASLP (1<<1) /* awaiting draining of printer */ -#define ERROR (1<<2) /* error was received from printer */ -#define OBUSY (1<<3) /* printer is busy doing output */ -#define LPTOUT (1<<4) /* timeout while not selected */ -#define TOUT (1<<5) /* timeout while not selected */ -#define INIT (1<<6) /* waiting to initialize for open */ -#define INTERRUPTED (1<<7) /* write call was interrupted */ - - -/* status masks to interrogate printer status */ -#define RDY_MASK (LPS_SEL|LPS_OUT|LPS_NBSY|LPS_NERR) /* ready ? */ -#define LP_READY (LPS_SEL|LPS_NBSY|LPS_NERR) - -/* Printer Ready condition - from lpa.c */ -/* Only used in polling code */ -#define NOT_READY(x) ((inb(x) & LPS_NBSY) != LPS_NBSY) - -#define MAX_SLEEP (hz*5) /* Timeout while waiting for device ready */ -#define MAX_SPIN 20 /* Max delay for device ready in usecs */ - -static timeout_t lptout; -static int lpt_probe(device_t); -static int lpt_attach(device_t); -static void lpt_intr(void *); - -static devclass_t olpt_devclass; - -static device_method_t olpt_methods[] = { - DEVMETHOD(device_probe, lpt_probe), - DEVMETHOD(device_attach, lpt_attach), - { 0, 0 } -}; - -static driver_t olpt_driver = { - "olpt", - olpt_methods, - sizeof (struct lpt_softc), -}; - -DRIVER_MODULE(olpt, isa, olpt_driver, olpt_devclass, 0, 0); - -static d_open_t lptopen; -static d_close_t lptclose; -static d_write_t lptwrite; -static d_ioctl_t lptioctl; - -static struct cdevsw lpt_cdevsw = { - .d_version = D_VERSION, - .d_flags = D_NEEDGIANT, - .d_open = lptopen, - .d_close = lptclose, - .d_write = lptwrite, - .d_ioctl = lptioctl, - .d_name = "lpt", -}; - -static bus_addr_t lpt_iat[] = {0, 2, 4, 6}; - -/* - * New lpt port probe Geoff Rehmet - Rhodes University - 14/2/94 - * Based partially on Rod Grimes' printer probe - * - * Logic: - * 1) If no port address was given, use the bios detected ports - * and autodetect what ports the printers are on. - * 2) Otherwise, probe the data port at the address given, - * using the method in Rod Grimes' port probe. - * (Much code ripped off directly from Rod's probe.) - * - * Comments from Rod's probe: - * Logic: - * 1) You should be able to write to and read back the same value - * to the data port. Do an alternating zeros, alternating ones, - * walking zero, and walking one test to check for stuck bits. - * - * 2) You should be able to write to and read back the same value - * to the control port lower 5 bits, the upper 3 bits are reserved - * per the IBM PC technical reference manauls and different boards - * do different things with them. Do an alternating zeros, alternating - * ones, walking zero, and walking one test to check for stuck bits. - * - * Some printers drag the strobe line down when the are powered off - * so this bit has been masked out of the control port test. - * - * XXX Some printers may not like a fast pulse on init or strobe, I - * don't know at this point, if that becomes a problem these bits - * should be turned off in the mask byte for the control port test. - * - * We are finally left with a mask of 0x14, due to some printers - * being adamant about holding other bits high ........ - * - * Before probing the control port, we write a 0 to the data port - - * If not, some printers chuck out garbage when the strobe line - * gets toggled. - * - * 3) Set the data and control ports to a value of 0 - * - * This probe routine has been tested on Epson Lx-800, HP LJ3P, - * Epson FX-1170 and C.Itoh 8510RM - * printers. - * Quick exit on fail added. - */ - -int -lpt_probe(device_t dev) -{ -#define PC98_OLD_LPT 0x40 -#define PC98_IEEE_1284_FUNCTION 0x149 - int rid; - struct resource *res; - - /* Check isapnp ids */ - if (isa_get_vendorid(dev)) - return ENXIO; - - rid = 0; - res = isa_alloc_resourcev(dev, SYS_RES_IOPORT, &rid, lpt_iat, 4, - RF_ACTIVE); - if (res == NULL) - return ENXIO; - isa_load_resourcev(res, lpt_iat, 4); - - if (isa_get_port(dev) == PC98_OLD_LPT) { - unsigned int pc98_ieee_mode, tmp; - - tmp = inb(PC98_IEEE_1284_FUNCTION); - pc98_ieee_mode = tmp; - if ((tmp & 0x10) == 0x10) { - outb(PC98_IEEE_1284_FUNCTION, tmp & ~0x10); - tmp = inb(PC98_IEEE_1284_FUNCTION); - if ((tmp & 0x10) != 0x10) { - outb(PC98_IEEE_1284_FUNCTION, pc98_ieee_mode); - bus_release_resource(dev, SYS_RES_IOPORT, rid, - res); - return ENXIO; - } - } - } - - bus_release_resource(dev, SYS_RES_IOPORT, rid, res); - return 0; -} - -/* XXX Todo - try and detect if interrupt is working */ -int -lpt_attach(device_t dev) -{ - int rid, unit; - struct lpt_softc *sc; - struct cdev *cdev; - - unit = device_get_unit(dev); - sc = device_get_softc(dev); - callout_init(&sc->timer, 0); - - rid = 0; - sc->res_port = isa_alloc_resourcev(dev, SYS_RES_IOPORT, &rid, - lpt_iat, 4, RF_ACTIVE); - if (sc->res_port == NULL) - return ENXIO; - isa_load_resourcev(sc->res_port, lpt_iat, 4); - - sc->sc_port = rman_get_start(sc->res_port); - sc->sc_primed = 0; /* not primed yet */ - - outb(sc->sc_port+lpt_pstb_ctrl, LPC_DIS_PSTB); /* PSTB disable */ - outb(sc->sc_port+lpt_control, LPC_MODE8255); /* 8255 mode set */ - outb(sc->sc_port+lpt_control, LPC_NIRQ8); /* IRQ8 inactive */ - outb(sc->sc_port+lpt_control, LPC_NPSTB); /* PSTB inactive */ - outb(sc->sc_port+lpt_pstb_ctrl, LPC_EN_PSTB); /* PSTB enable */ - - sc->sc_irq = 0; - if (isa_get_irq(dev) != -1) { - rid = 0; - sc->res_irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid, - RF_ACTIVE); - if (sc->res_irq == NULL) { - bus_release_resource(dev, SYS_RES_IOPORT, 0, - sc->res_port); - return ENXIO; - } - if (bus_setup_intr(dev, sc->res_irq, INTR_TYPE_TTY, NULL, lpt_intr, - sc, &sc->sc_ih)) { - bus_release_resource(dev, SYS_RES_IOPORT, 0, - sc->res_port); - bus_release_resource(dev, SYS_RES_IRQ, 0, - sc->res_irq); - return ENXIO; - } - sc->sc_irq = LP_HAS_IRQ | LP_USE_IRQ | LP_ENABLE_IRQ; - device_printf(dev, "Interrupt-driven port"); - } - - cdev = make_dev(&lpt_cdevsw, 0, - UID_ROOT, GID_WHEEL, 0600, "lpt%d", unit); - cdev->si_drv1 = sc; - cdev = make_dev(&lpt_cdevsw, LP_BYPASS, - UID_ROOT, GID_WHEEL, 0600, "lpctl%d", unit); - cdev->si_drv1 = sc; - - return 0; -} - -/* - * lptopen -- reset the printer, then wait until it's selected and not busy. - * If LP_BYPASS flag is selected, then we do not try to select the - * printer -- this is just used for passing ioctls. - */ - -static int -lptopen (struct cdev *dev, int flags, int fmt, struct thread *td) -{ - struct lpt_softc *sc = dev->si_drv1; - int s; - int port; - - if (sc->sc_port == 0) - return (ENXIO); - - if (sc->sc_state) { - lprintf(("lp: still open %x\n", sc->sc_state)); - return(EBUSY); - } else - sc->sc_state |= INIT; - - sc->sc_flags = dev2unit(dev); - - /* Check for open with BYPASS flag set. */ - if (sc->sc_flags & LP_BYPASS) { - sc->sc_state = OPEN; - return(0); - } - - s = spltty(); - lprintf(("lp flags 0x%x\n", sc->sc_flags)); - port = sc->sc_port; - - /* set IRQ status according to ENABLE_IRQ flag */ - if (sc->sc_irq & LP_ENABLE_IRQ) - sc->sc_irq |= LP_USE_IRQ; - else - sc->sc_irq &= ~LP_USE_IRQ; - - /* init printer */ - sc->sc_state = OPEN; - sc->sc_inbuf = malloc(BUFSIZE, M_DEVBUF, M_WAITOK); - sc->sc_xfercnt = 0; - splx(s); - - /* only use timeout if using interrupt */ - lprintf(("irq %x\n", sc->sc_irq)); - if (sc->sc_irq & LP_USE_IRQ) { - sc->sc_state |= TOUT; - sc->sc_backoff = hz / LPTOUTINITIAL; - callout_reset(&sc->timer, sc->sc_backoff, lptout, sc); - } - - lprintf(("opened.\n")); - return(0); -} - -static void -lptout (void *arg) -{ - struct lpt_softc *sc = arg; - int pl; - - lprintf(("T %x ", inb(sc->sc_port+lpt_status))); - if (sc->sc_state & OPEN) { - sc->sc_backoff++; - if (sc->sc_backoff > hz/LPTOUTMAX) - sc->sc_backoff = sc->sc_backoff > hz/LPTOUTMAX; - callout_reset(&sc->timer, sc->sc_backoff, lptout, sc); - } else - sc->sc_state &= ~TOUT; - - if (sc->sc_state & ERROR) - sc->sc_state &= ~ERROR; - - /* - * Avoid possible hangs do to missed interrupts - */ - if (sc->sc_xfercnt) { - pl = spltty(); - lpt_intr(sc); - splx(pl); - } else { - sc->sc_state &= ~OBUSY; - wakeup(sc); - } -} - -/* - * lptclose -- close the device, free the local line buffer. - * - * Check for interrupted write call added. - */ - -static int -lptclose(struct cdev *dev, int flags, int fmt, struct thread *td) -{ - struct lpt_softc *sc = dev->si_drv1; - - if(sc->sc_flags & LP_BYPASS) - goto end_close; - - sc->sc_state &= ~OPEN; - free(sc->sc_inbuf, M_DEVBUF); - -end_close: - sc->sc_state = 0; - sc->sc_xfercnt = 0; - lprintf(("closed.\n")); - return(0); -} - -/* - * pushbytes() - * Workhorse for actually spinning and writing bytes to printer - * Derived from lpa.c - * Originally by ? - * - * This code is only used when we are polling the port - */ -static int -pushbytes(struct lpt_softc * sc) -{ - int spin, err, tic; - char ch; - int port = sc->sc_port; - - lprintf(("p")); - /* loop for every character .. */ - while (sc->sc_xfercnt > 0) { - /* printer data */ - ch = *(sc->sc_cp); - sc->sc_cp++; - sc->sc_xfercnt--; - - /* - * Wait for printer ready. - * Loop 20 usecs testing BUSY bit, then sleep - * for exponentially increasing timeout. (vak) - */ - for (spin=0; NOT_READY(port+lpt_status) && spin<MAX_SPIN; ++spin) - DELAY(1); /* XXX delay is NOT this accurate! */ - if (spin >= MAX_SPIN) { - tic = 0; - while (NOT_READY(port+lpt_status)) { - /* - * Now sleep, every cycle a - * little longer .. - */ - tic = tic + tic + 1; - /* - * But no more than 10 seconds. (vak) - */ - if (tic > MAX_SLEEP) - tic = MAX_SLEEP; - err = tsleep(sc, LPPRI, - "lptpoll", tic); - if (err != EWOULDBLOCK) { - return (err); - } - } - } - - /* output data */ - outb(port+lpt_data, ch); - DELAY(1); - outb(port+lpt_control, LPC_PSTB); - DELAY(1); - outb(port+lpt_control, LPC_NPSTB); - } - return(0); -} - -/* - * lptwrite --copy a line from user space to a local buffer, then call - * putc to get the chars moved to the output queue. - * - * Flagging of interrupted write added. - */ - -static int -lptwrite(struct cdev *dev, struct uio * uio, int ioflag) -{ - register unsigned n; - int pl, err; - struct lpt_softc *sc = dev->si_drv1; - - if(sc->sc_flags & LP_BYPASS) { - /* we can't do writes in bypass mode */ - return(EPERM); - } - - sc->sc_state &= ~INTERRUPTED; - while ((n = min(BUFSIZE, uio->uio_resid)) != 0) { - sc->sc_cp = sc->sc_inbuf; - uiomove(sc->sc_cp, n, uio); - sc->sc_xfercnt = n ; - while ((sc->sc_xfercnt > 0)&&(sc->sc_irq & LP_USE_IRQ)) { - lprintf(("i")); - /* if the printer is ready for a char, */ - /* give it one */ - if ((sc->sc_state & OBUSY) == 0){ - lprintf(("\nC %d. ", sc->sc_xfercnt)); - pl = spltty(); - lpt_intr(sc); - (void) splx(pl); - } - lprintf(("W ")); - if (sc->sc_state & OBUSY) - if ((err = tsleep (sc, - LPPRI|PCATCH, "lpwrite", 0))) { - sc->sc_state |= INTERRUPTED; - return(err); - } - } - /* check to see if we must do a polled write */ - if(!(sc->sc_irq & LP_USE_IRQ) && (sc->sc_xfercnt)) { - lprintf(("p")); - if((err = pushbytes(sc))) - return(err); - } - } - return(0); -} - -/* - * lptintr -- handle printer interrupts which occur when the printer is - * ready to accept another char. - * - * do checking for interrupted write call. - */ - -static void -lpt_intr(void *arg) -{ -} - -static int -lptioctl(struct cdev *dev, u_long cmd, caddr_t data, int flags, struct thread *td) -{ - int error = 0; - struct lpt_softc *sc = dev->si_drv1; - u_char old_sc_irq; /* old printer IRQ status */ - - switch (cmd) { - case LPT_IRQ : - if(sc->sc_irq & LP_HAS_IRQ) { - /* - * NOTE: - * If the IRQ status is changed, - * this will only be visible on the - * next open. - * - * If interrupt status changes, - * this gets syslog'd. - */ - old_sc_irq = sc->sc_irq; - if(*(int*)data == 0) - sc->sc_irq &= (~LP_ENABLE_IRQ); - else - sc->sc_irq |= LP_ENABLE_IRQ; - if (old_sc_irq != sc->sc_irq ) - log(LOG_NOTICE, "%s switched to %s mode\n", - devtoname(dev), - (sc->sc_irq & LP_ENABLE_IRQ)? - "interrupt-driven":"polled"); - } else /* polled port */ - error = EOPNOTSUPP; - break; - default: - error = ENODEV; - } - - return(error); -} diff --git a/sys/pc98/cbus/olptreg.h b/sys/pc98/cbus/olptreg.h deleted file mode 100644 index 80bc704f006c..000000000000 --- a/sys/pc98/cbus/olptreg.h +++ /dev/null @@ -1,48 +0,0 @@ -/*- - * Copyright (c) 2005 TAKAHASHI Yoshihiro - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * $FreeBSD$ - */ - -/* - * modified for PC9801 by A.Kojima - * Kyoto University Microcomputer Club (KMC) - */ - -#define lpt_pstb_ctrl (-9) /* PSTB enable control */ -#define LPC_EN_PSTB 0xc /* PSTB enable */ -#define LPC_DIS_PSTB 0xd /* PSTB disable */ - -#define lpt_data 0 /* Data to/from printer (R/W) */ - -#define lpt_status 2 /* Status of printer (R) */ -#define LPS_NBSY 0x4 /* printer no ack of data */ - -#define lpt_control 6 /* Control printer (W) */ -#define LPC_MODE8255 0x82 /* 8255 mode */ -#define LPC_IRQ8 0x6 /* IRQ8 active */ -#define LPC_NIRQ8 0x7 /* IRQ8 inactive */ -#define LPC_PSTB 0xe /* PSTB active */ -#define LPC_NPSTB 0xf /* PSTB inactive */ diff --git a/sys/pc98/cbus/pckbd.c b/sys/pc98/cbus/pckbd.c deleted file mode 100644 index aec0f0dd2849..000000000000 --- a/sys/pc98/cbus/pckbd.c +++ /dev/null @@ -1,999 +0,0 @@ -/*- - * Copyright (c) 1999 FreeBSD(98) port team. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer as - * the first lines of this file unmodified. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD$ - */ - -#include "opt_compat.h" -#include "opt_kbd.h" - -#include <sys/param.h> -#include <sys/systm.h> -#include <sys/kernel.h> -#include <sys/module.h> -#include <sys/bus.h> -#include <machine/bus.h> -#include <sys/rman.h> -#include <sys/kbio.h> - -#include <machine/resource.h> - -#include <dev/kbd/kbdreg.h> - -#include <pc98/cbus/cbus.h> -#include <isa/isavar.h> - -#define DRIVER_NAME "pckbd" - -/* device configuration flags */ -#define KB_CONF_FAIL_IF_NO_KBD (1 << 0) /* don't install if no kbd is found */ - -typedef caddr_t KBDC; - -typedef struct pckbd_state { - KBDC kbdc; /* keyboard controller */ - int ks_mode; /* input mode (K_XLATE,K_RAW,K_CODE) */ - int ks_flags; /* flags */ -#define COMPOSE (1 << 0) - int ks_state; /* shift/lock key state */ - int ks_accents; /* accent key index (> 0) */ - u_int ks_composed_char; /* composed char code (> 0) */ - struct callout ks_timer; -} pckbd_state_t; - -static devclass_t pckbd_devclass; - -static int pckbdprobe(device_t dev); -static int pckbdattach(device_t dev); -static int pckbdresume(device_t dev); -static void pckbd_isa_intr(void *arg); - -static device_method_t pckbd_methods[] = { - /* Device interface */ - DEVMETHOD(device_probe, pckbdprobe), - DEVMETHOD(device_attach, pckbdattach), - DEVMETHOD(device_resume, pckbdresume), - { 0, 0 } -}; - -static driver_t pckbd_driver = { - DRIVER_NAME, - pckbd_methods, - 1, -}; - -DRIVER_MODULE(pckbd, isa, pckbd_driver, pckbd_devclass, 0, 0); - -static bus_addr_t pckbd_iat[] = {0, 2}; - -static int pckbd_probe_unit(device_t dev, int port, int irq, - int flags); -static int pckbd_attach_unit(device_t dev, keyboard_t **kbd, - int port, int irq, int flags); -static timeout_t pckbd_timeout; - - -static int -pckbdprobe(device_t dev) -{ - struct resource *res; - int error, rid; - - /* Check isapnp ids */ - if (isa_get_vendorid(dev)) - return (ENXIO); - - device_set_desc(dev, "PC-98 Keyboard"); - - rid = 0; - res = isa_alloc_resourcev(dev, SYS_RES_IOPORT, &rid, pckbd_iat, 2, - RF_ACTIVE); - if (res == NULL) - return ENXIO; - isa_load_resourcev(res, pckbd_iat, 2); - - error = pckbd_probe_unit(dev, - isa_get_port(dev), - (1 << isa_get_irq(dev)), - device_get_flags(dev)); - - bus_release_resource(dev, SYS_RES_IOPORT, rid, res); - - return (error); -} - -static int -pckbdattach(device_t dev) -{ - keyboard_t *kbd; - void *ih; - struct resource *res; - int error, rid; - - rid = 0; - res = isa_alloc_resourcev(dev, SYS_RES_IOPORT, &rid, pckbd_iat, 2, - RF_ACTIVE); - if (res == NULL) - return ENXIO; - isa_load_resourcev(res, pckbd_iat, 2); - - error = pckbd_attach_unit(dev, &kbd, - isa_get_port(dev), - (1 << isa_get_irq(dev)), - device_get_flags(dev)); - - rid = 0; - res = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid, RF_ACTIVE); - if (res == NULL) - return ENXIO; - bus_setup_intr(dev, res, INTR_TYPE_TTY, NULL, pckbd_isa_intr, kbd, &ih); - - return 0; -} - -static int -pckbdresume(device_t dev) -{ - keyboard_t *kbd; - - kbd = kbd_get_keyboard(kbd_find_keyboard(DRIVER_NAME, - device_get_unit(dev))); - if (kbd) - kbdd_clear_state(kbd); - - return (0); -} - -static void -pckbd_isa_intr(void *arg) -{ - keyboard_t *kbd = arg; - - kbdd_intr(kbd, NULL); -} - -static int -pckbd_probe_unit(device_t dev, int port, int irq, int flags) -{ - keyboard_switch_t *sw; - int args[2]; - int error; - - sw = kbd_get_switch(DRIVER_NAME); - if (sw == NULL) - return ENXIO; - - args[0] = port; - args[1] = irq; - error = (*sw->probe)(device_get_unit(dev), args, flags); - if (error) - return error; - return 0; -} - -static int -pckbd_attach_unit(device_t dev, keyboard_t **kbd, int port, int irq, int flags) -{ - keyboard_switch_t *sw; - pckbd_state_t *state; - int args[2]; - int error; - int unit; - - sw = kbd_get_switch(DRIVER_NAME); - if (sw == NULL) - return ENXIO; - - /* reset, initialize and enable the device */ - unit = device_get_unit(dev); - args[0] = port; - args[1] = irq; - *kbd = NULL; - error = (*sw->probe)(unit, args, flags); - if (error) - return error; - error = (*sw->init)(unit, kbd, args, flags); - if (error) - return error; - (*sw->enable)(*kbd); - -#ifdef KBD_INSTALL_CDEV - /* attach a virtual keyboard cdev */ - error = kbd_attach(*kbd); - if (error) - return error; -#endif /* KBD_INSTALL_CDEV */ - - /* - * This is a kludge to compensate for lost keyboard interrupts. - * A similar code used to be in syscons. See below. XXX - */ - state = (pckbd_state_t *)(*kbd)->kb_data; - callout_init(&state->ks_timer, 0); - pckbd_timeout(*kbd); - - if (bootverbose) - (*sw->diag)(*kbd, bootverbose); - - return 0; -} - -static void -pckbd_timeout(void *arg) -{ - pckbd_state_t *state; - keyboard_t *kbd; - int s; - - /* The following comments are extracted from syscons.c (1.287) */ - /* - * With release 2.1 of the Xaccel server, the keyboard is left - * hanging pretty often. Apparently an interrupt from the - * keyboard is lost, and I don't know why (yet). - * This ugly hack calls scintr if input is ready for the keyboard - * and conveniently hides the problem. XXX - */ - /* - * Try removing anything stuck in the keyboard controller; whether - * it's a keyboard scan code or mouse data. `scintr()' doesn't - * read the mouse data directly, but `kbdio' routines will, as a - * side effect. - */ - s = spltty(); - kbd = (keyboard_t *)arg; - if (kbdd_lock(kbd, TRUE)) { - /* - * We have seen the lock flag is not set. Let's reset - * the flag early, otherwise the LED update routine fails - * which may want the lock during the interrupt routine. - */ - kbdd_lock(kbd, FALSE); - if (kbdd_check_char(kbd)) - kbdd_intr(kbd, NULL); - } - splx(s); - state = (pckbd_state_t *)kbd->kb_data; - callout_reset(&state->ks_timer, hz / 10, pckbd_timeout, arg); -} - -/* LOW-LEVEL */ - -#include <sys/limits.h> - -#define PC98KBD_DEFAULT 0 - -/* keyboard driver declaration */ -static int pckbd_configure(int flags); -static kbd_probe_t pckbd_probe; -static kbd_init_t pckbd_init; -static kbd_term_t pckbd_term; -static kbd_intr_t pckbd_intr; -static kbd_test_if_t pckbd_test_if; -static kbd_enable_t pckbd_enable; -static kbd_disable_t pckbd_disable; -static kbd_read_t pckbd_read; -static kbd_check_t pckbd_check; -static kbd_read_char_t pckbd_read_char; -static kbd_check_char_t pckbd_check_char; -static kbd_ioctl_t pckbd_ioctl; -static kbd_lock_t pckbd_lock; -static kbd_clear_state_t pckbd_clear_state; -static kbd_get_state_t pckbd_get_state; -static kbd_set_state_t pckbd_set_state; -static kbd_poll_mode_t pckbd_poll; - -keyboard_switch_t pckbdsw = { - pckbd_probe, - pckbd_init, - pckbd_term, - pckbd_intr, - pckbd_test_if, - pckbd_enable, - pckbd_disable, - pckbd_read, - pckbd_check, - pckbd_read_char, - pckbd_check_char, - pckbd_ioctl, - pckbd_lock, - pckbd_clear_state, - pckbd_get_state, - pckbd_set_state, - genkbd_get_fkeystr, - pckbd_poll, - genkbd_diag, -}; - -KEYBOARD_DRIVER(pckbd, pckbdsw, pckbd_configure); - -struct kbdc_softc { - int port; /* base port address */ - int lock; /* FIXME: XXX not quite a semaphore... */ -}; - -/* local functions */ -static int probe_keyboard(KBDC kbdc, int flags); -static int init_keyboard(KBDC kbdc, int *type, int flags); -static KBDC kbdc_open(int port); -static int kbdc_lock(KBDC kbdc, int lock); -static int kbdc_data_ready(KBDC kbdc); -static int read_kbd_data(KBDC kbdc); -static int read_kbd_data_no_wait(KBDC kbdc); -static int wait_for_kbd_data(struct kbdc_softc *kbdc); - -/* local variables */ - -/* the initial key map, accent map and fkey strings */ -#include <pc98/cbus/pckbdtables.h> - -/* structures for the default keyboard */ -static keyboard_t default_kbd; -static pckbd_state_t default_kbd_state; -static keymap_t default_keymap; -static accentmap_t default_accentmap; -static fkeytab_t default_fkeytab[NUM_FKEYS]; - -/* - * The back door to the keyboard driver! - * This function is called by the console driver, via the kbdio module, - * to tickle keyboard drivers when the low-level console is being initialized. - * Almost nothing in the kernel has been initialied yet. Try to probe - * keyboards if possible. - * NOTE: because of the way the low-level conole is initialized, this routine - * may be called more than once!! - */ -static int -pckbd_configure(int flags) -{ - keyboard_t *kbd; - int arg[2]; - int i; - - /* XXX: a kludge to obtain the device configuration flags */ - if (resource_int_value(DRIVER_NAME, 0, "flags", &i) == 0) { - flags |= i; - /* if the driver is disabled, unregister the keyboard if any */ - if (resource_disabled(DRIVER_NAME, 0)) { - i = kbd_find_keyboard(DRIVER_NAME, PC98KBD_DEFAULT); - if (i >= 0) { - kbd = kbd_get_keyboard(i); - kbd_unregister(kbd); - kbd->kb_flags &= ~KB_REGISTERED; - return 0; - } - } - } - - /* probe the default keyboard */ - arg[0] = -1; - arg[1] = -1; - kbd = NULL; - if (pckbd_probe(PC98KBD_DEFAULT, arg, flags)) - return 0; - if (pckbd_init(PC98KBD_DEFAULT, &kbd, arg, flags)) - return 0; - - /* return the number of found keyboards */ - return 1; -} - -/* low-level functions */ - -/* detect a keyboard */ -static int -pckbd_probe(int unit, void *arg, int flags) -{ - KBDC kbdc; - int *data = (int *)arg; - - if (unit != PC98KBD_DEFAULT) - return ENXIO; - if (KBD_IS_PROBED(&default_kbd)) - return 0; - - kbdc = kbdc_open(data[0]); - if (kbdc == NULL) - return ENXIO; - if (probe_keyboard(kbdc, flags)) { - if (flags & KB_CONF_FAIL_IF_NO_KBD) - return ENXIO; - } - return 0; -} - -/* reset and initialize the device */ -static int -pckbd_init(int unit, keyboard_t **kbdp, void *arg, int flags) -{ - keyboard_t *kbd; - pckbd_state_t *state; - keymap_t *keymap; - accentmap_t *accmap; - fkeytab_t *fkeymap; - int fkeymap_size; - int *data = (int *)arg; - - if (unit != PC98KBD_DEFAULT) /* shouldn't happen */ - return ENXIO; - - *kbdp = kbd = &default_kbd; - state = &default_kbd_state; - if (!KBD_IS_PROBED(kbd)) { - keymap = &default_keymap; - accmap = &default_accentmap; - fkeymap = default_fkeytab; - fkeymap_size = nitems(default_fkeytab); - - state->kbdc = kbdc_open(data[0]); - if (state->kbdc == NULL) - return ENXIO; - kbd_init_struct(kbd, DRIVER_NAME, KB_OTHER, unit, flags, - data[0], IO_KBDSIZE); - bcopy(&key_map, keymap, sizeof(key_map)); - bcopy(&accent_map, accmap, sizeof(accent_map)); - bcopy(fkey_tab, fkeymap, - imin(fkeymap_size*sizeof(fkeymap[0]), sizeof(fkey_tab))); - kbd_set_maps(kbd, keymap, accmap, fkeymap, fkeymap_size); - kbd->kb_data = (void *)state; - - if (probe_keyboard(state->kbdc, flags)) {/* shouldn't happen */ - if (flags & KB_CONF_FAIL_IF_NO_KBD) - return ENXIO; - } else { - KBD_FOUND_DEVICE(kbd); - } - pckbd_clear_state(kbd); - state->ks_mode = K_XLATE; - KBD_PROBE_DONE(kbd); - } - if (!KBD_IS_INITIALIZED(kbd) && !(flags & KB_CONF_PROBE_ONLY)) { - if (KBD_HAS_DEVICE(kbd) - && init_keyboard(state->kbdc, &kbd->kb_type, kbd->kb_config) - && (kbd->kb_config & KB_CONF_FAIL_IF_NO_KBD)) - return ENXIO; - pckbd_ioctl(kbd, KDSETLED, (caddr_t)&state->ks_state); - KBD_INIT_DONE(kbd); - } - if (!KBD_IS_CONFIGURED(kbd)) { - if (kbd_register(kbd) < 0) - return ENXIO; - KBD_CONFIG_DONE(kbd); - } - - return 0; -} - -/* finish using this keyboard */ -static int -pckbd_term(keyboard_t *kbd) -{ - pckbd_state_t *state = (pckbd_state_t *)kbd->kb_data; - - kbd_unregister(kbd); - callout_drain(&state->ks_timer); - return 0; -} - -/* keyboard interrupt routine */ -static int -pckbd_intr(keyboard_t *kbd, void *arg) -{ - int c; - - if (KBD_IS_ACTIVE(kbd) && KBD_IS_BUSY(kbd)) { - /* let the callback function to process the input */ - (*kbd->kb_callback.kc_func)(kbd, KBDIO_KEYINPUT, - kbd->kb_callback.kc_arg); - } else { - /* read and discard the input; no one is waiting for input */ - do { - c = pckbd_read_char(kbd, FALSE); - } while (c != NOKEY); - } - return 0; -} - -/* test the interface to the device */ -static int -pckbd_test_if(keyboard_t *kbd) -{ - return 0; -} - -/* - * Enable the access to the device; until this function is called, - * the client cannot read from the keyboard. - */ -static int -pckbd_enable(keyboard_t *kbd) -{ - int s; - - s = spltty(); - KBD_ACTIVATE(kbd); - splx(s); - return 0; -} - -/* disallow the access to the device */ -static int -pckbd_disable(keyboard_t *kbd) -{ - int s; - - s = spltty(); - KBD_DEACTIVATE(kbd); - splx(s); - return 0; -} - -/* read one byte from the keyboard if it's allowed */ -static int -pckbd_read(keyboard_t *kbd, int wait) -{ - int c; - - if (wait) - c = read_kbd_data(((pckbd_state_t *)kbd->kb_data)->kbdc); - else - c = read_kbd_data_no_wait(((pckbd_state_t *)kbd->kb_data)->kbdc); - if (c != -1) - ++kbd->kb_count; - return (KBD_IS_ACTIVE(kbd) ? c : -1); -} - -/* check if data is waiting */ -static int -pckbd_check(keyboard_t *kbd) -{ - if (!KBD_IS_ACTIVE(kbd)) - return FALSE; - return kbdc_data_ready(((pckbd_state_t *)kbd->kb_data)->kbdc); -} - -/* read char from the keyboard */ -static u_int -pckbd_read_char(keyboard_t *kbd, int wait) -{ - pckbd_state_t *state; - u_int action; - int scancode; - int keycode; - - state = (pckbd_state_t *)kbd->kb_data; -next_code: - /* do we have a composed char to return? */ - if (!(state->ks_flags & COMPOSE) && (state->ks_composed_char > 0)) { - action = state->ks_composed_char; - state->ks_composed_char = 0; - if (action > UCHAR_MAX) - return ERRKEY; - return action; - } - - /* see if there is something in the keyboard port */ - if (wait) { - do { - scancode = read_kbd_data(state->kbdc); - } while (scancode == -1); - } else { - scancode = read_kbd_data_no_wait(state->kbdc); - if (scancode == -1) - return NOKEY; - } - ++kbd->kb_count; - -#if 0 - printf("pckbd_read_char(): scancode:0x%x\n", scancode); -#endif - - /* return the byte as is for the K_RAW mode */ - if (state->ks_mode == K_RAW) - return scancode; - - /* translate the scan code into a keycode */ - keycode = scancode & 0x7F; - switch(scancode) { - case 0xF3: /* GRPH (compose key) released */ - if (state->ks_flags & COMPOSE) { - state->ks_flags &= ~COMPOSE; - if (state->ks_composed_char > UCHAR_MAX) - state->ks_composed_char = 0; - } - break; - case 0x73: /* GRPH (compose key) pressed */ - if (!(state->ks_flags & COMPOSE)) { - state->ks_flags |= COMPOSE; - state->ks_composed_char = 0; - } - break; - } - - /* return the key code in the K_CODE mode */ - if (state->ks_mode == K_CODE) - return (keycode | (scancode & 0x80)); - - /* compose a character code */ - if (state->ks_flags & COMPOSE) { - switch (scancode) { - /* key pressed, process it */ - case 0x42: case 0x43: case 0x44: /* keypad 7,8,9 */ - state->ks_composed_char *= 10; - state->ks_composed_char += scancode - 0x3B; - if (state->ks_composed_char > UCHAR_MAX) - return ERRKEY; - goto next_code; - case 0x46: case 0x47: case 0x48: /* keypad 4,5,6 */ - state->ks_composed_char *= 10; - state->ks_composed_char += scancode - 0x42; - if (state->ks_composed_char > UCHAR_MAX) - return ERRKEY; - goto next_code; - case 0x4A: case 0x4B: case 0x4C: /* keypad 1,2,3 */ - state->ks_composed_char *= 10; - state->ks_composed_char += scancode - 0x49; - if (state->ks_composed_char > UCHAR_MAX) - return ERRKEY; - goto next_code; - case 0x4E: /* keypad 0 */ - state->ks_composed_char *= 10; - if (state->ks_composed_char > UCHAR_MAX) - return ERRKEY; - goto next_code; - - /* key released, no interest here */ - case 0xC2: case 0xC3: case 0xC4: /* keypad 7,8,9 */ - case 0xC6: case 0xC7: case 0xC8: /* keypad 4,5,6 */ - case 0xCA: case 0xCB: case 0xCC: /* keypad 1,2,3 */ - case 0xCE: /* keypad 0 */ - goto next_code; - - case 0x73: /* GRPH key */ - break; - - default: - if (state->ks_composed_char > 0) { - state->ks_flags &= ~COMPOSE; - state->ks_composed_char = 0; - return ERRKEY; - } - break; - } - } - - /* keycode to key action */ - action = genkbd_keyaction(kbd, keycode, scancode & 0x80, - &state->ks_state, &state->ks_accents); - if (action == NOKEY) - goto next_code; - else - return action; -} - -/* check if char is waiting */ -static int -pckbd_check_char(keyboard_t *kbd) -{ - pckbd_state_t *state; - - if (!KBD_IS_ACTIVE(kbd)) - return FALSE; - state = (pckbd_state_t *)kbd->kb_data; - if (!(state->ks_flags & COMPOSE) && (state->ks_composed_char > 0)) - return TRUE; - return kbdc_data_ready(state->kbdc); -} - -/* some useful control functions */ -static int -pckbd_ioctl(keyboard_t *kbd, u_long cmd, caddr_t arg) -{ - pckbd_state_t *state = kbd->kb_data; - int s; - int i; -#if defined(COMPAT_FREEBSD6) || defined(COMPAT_FREEBSD5) || \ - defined(COMPAT_FREEBSD4) || defined(COMPAT_43) - int ival; -#endif - - s = spltty(); - switch (cmd) { - - case KDGKBMODE: /* get keyboard mode */ - *(int *)arg = state->ks_mode; - break; -#if defined(COMPAT_FREEBSD6) || defined(COMPAT_FREEBSD5) || \ - defined(COMPAT_FREEBSD4) || defined(COMPAT_43) - case _IO('K', 7): - ival = IOCPARM_IVAL(arg); - arg = (caddr_t)&ival; - /* FALLTHROUGH */ -#endif - case KDSKBMODE: /* set keyboard mode */ - switch (*(int *)arg) { - case K_XLATE: - if (state->ks_mode != K_XLATE) { - /* make lock key state and LED state match */ - state->ks_state &= ~LOCK_MASK; - state->ks_state |= KBD_LED_VAL(kbd); - } - /* FALLTHROUGH */ - case K_RAW: - case K_CODE: - if (state->ks_mode != *(int *)arg) { - pckbd_clear_state(kbd); - state->ks_mode = *(int *)arg; - } - break; - default: - splx(s); - return EINVAL; - } - break; - - case KDGETLED: /* get keyboard LED */ - *(int *)arg = KBD_LED_VAL(kbd); - break; -#if defined(COMPAT_FREEBSD6) || defined(COMPAT_FREEBSD5) || \ - defined(COMPAT_FREEBSD4) || defined(COMPAT_43) - case _IO('K', 66): - ival = IOCPARM_IVAL(arg); - arg = (caddr_t)&ival; - /* FALLTHROUGH */ -#endif - case KDSETLED: /* set keyboard LED */ - /* NOTE: lock key state in ks_state won't be changed */ - if (*(int *)arg & ~LOCK_MASK) { - splx(s); - return EINVAL; - } - i = *(int *)arg; - /* replace CAPS LED with ALTGR LED for ALTGR keyboards */ - if (kbd->kb_keymap->n_keys > ALTGR_OFFSET) { - if (i & ALKED) - i |= CLKED; - else - i &= ~CLKED; - } - KBD_LED_VAL(kbd) = *(int *)arg; - break; - - case KDGKBSTATE: /* get lock key state */ - *(int *)arg = state->ks_state & LOCK_MASK; - break; -#if defined(COMPAT_FREEBSD6) || defined(COMPAT_FREEBSD5) || \ - defined(COMPAT_FREEBSD4) || defined(COMPAT_43) - case _IO('K', 20): - ival = IOCPARM_IVAL(arg); - arg = (caddr_t)&ival; - /* FALLTHROUGH */ -#endif - case KDSKBSTATE: /* set lock key state */ - if (*(int *)arg & ~LOCK_MASK) { - splx(s); - return EINVAL; - } - state->ks_state &= ~LOCK_MASK; - state->ks_state |= *(int *)arg; - splx(s); - /* set LEDs and quit */ - return pckbd_ioctl(kbd, KDSETLED, arg); - - case KDSETRAD: /* set keyboard repeat rate (old interface)*/ - break; - case KDSETREPEAT: /* set keyboard repeat rate (new interface) */ - break; - - case PIO_KEYMAP: /* set keyboard translation table */ - case OPIO_KEYMAP: /* set keyboard translation table (compat) */ - case PIO_KEYMAPENT: /* set keyboard translation table entry */ - case PIO_DEADKEYMAP: /* set accent key translation table */ - state->ks_accents = 0; - /* FALLTHROUGH */ - default: - splx(s); - return genkbd_commonioctl(kbd, cmd, arg); - } - - splx(s); - return 0; -} - -/* lock the access to the keyboard */ -static int -pckbd_lock(keyboard_t *kbd, int lock) -{ - return kbdc_lock(((pckbd_state_t *)kbd->kb_data)->kbdc, lock); -} - -/* clear the internal state of the keyboard */ -static void -pckbd_clear_state(keyboard_t *kbd) -{ - pckbd_state_t *state; - - state = (pckbd_state_t *)kbd->kb_data; - state->ks_flags = 0; - state->ks_state &= LOCK_MASK; /* preserve locking key state */ - state->ks_accents = 0; - state->ks_composed_char = 0; -} - -/* save the internal state */ -static int -pckbd_get_state(keyboard_t *kbd, void *buf, size_t len) -{ - if (len == 0) - return sizeof(pckbd_state_t); - if (len < sizeof(pckbd_state_t)) - return -1; - bcopy(kbd->kb_data, buf, sizeof(pckbd_state_t)); - return 0; -} - -/* set the internal state */ -static int -pckbd_set_state(keyboard_t *kbd, void *buf, size_t len) -{ - if (len < sizeof(pckbd_state_t)) - return ENOMEM; - if (((pckbd_state_t *)kbd->kb_data)->kbdc - != ((pckbd_state_t *)buf)->kbdc) - return ENOMEM; - bcopy(buf, kbd->kb_data, sizeof(pckbd_state_t)); - return 0; -} - -/* set polling mode */ -static int -pckbd_poll(keyboard_t *kbd, int on) -{ - return 0; -} - -/* local functions */ - -static int -probe_keyboard(KBDC kbdc, int flags) -{ - return 0; -} - -static int -init_keyboard(KBDC kbdc, int *type, int flags) -{ - *type = KB_OTHER; - return 0; -} - -/* keyboard I/O routines */ - -/* retry count */ -#ifndef KBD_MAXRETRY -#define KBD_MAXRETRY 3 -#endif - -/* timing parameters */ -#ifndef KBD_RESETDELAY -#define KBD_RESETDELAY 200 /* wait 200msec after kbd/mouse reset */ -#endif -#ifndef KBD_MAXWAIT -#define KBD_MAXWAIT 5 /* wait 5 times at most after reset */ -#endif - -/* I/O recovery time */ -#define KBDC_DELAYTIME 37 -#define KBDD_DELAYTIME 37 - -/* I/O ports */ -#define KBD_STATUS_PORT 2 /* status port, read */ -#define KBD_DATA_PORT 0 /* data port, read */ - -/* status bits (KBD_STATUS_PORT) */ -#define KBDS_BUFFER_FULL 0x0002 - -/* macros */ - -#define kbdcp(p) ((struct kbdc_softc *)(p)) - -/* local variables */ - -static struct kbdc_softc kbdc_softc[1] = { { 0 }, }; - -/* associate a port number with a KBDC */ - -static KBDC -kbdc_open(int port) -{ - if (port <= 0) - port = IO_KBD; - - /* PC-98 has only one keyboard I/F */ - kbdc_softc[0].port = port; - kbdc_softc[0].lock = FALSE; - return (KBDC)&kbdc_softc[0]; -} - -/* set/reset polling lock */ -static int -kbdc_lock(KBDC p, int lock) -{ - int prevlock; - - prevlock = kbdcp(p)->lock; - kbdcp(p)->lock = lock; - - return (prevlock != lock); -} - -/* check if any data is waiting to be processed */ -static int -kbdc_data_ready(KBDC p) -{ - return (inb(kbdcp(p)->port + KBD_STATUS_PORT) & KBDS_BUFFER_FULL); -} - -/* wait for data from the keyboard */ -static int -wait_for_kbd_data(struct kbdc_softc *kbdc) -{ - /* CPU will stay inside the loop for 200msec at most */ - int retry = 10000; - int port = kbdc->port; - - while (!(inb(port + KBD_STATUS_PORT) & KBDS_BUFFER_FULL)) { - DELAY(KBDD_DELAYTIME); - DELAY(KBDC_DELAYTIME); - if (--retry < 0) - return 0; - } - DELAY(KBDD_DELAYTIME); - return 1; -} - -/* read one byte from the keyboard */ -static int -read_kbd_data(KBDC p) -{ - if (!wait_for_kbd_data(kbdcp(p))) - return -1; /* timeout */ - DELAY(KBDC_DELAYTIME); - return inb(kbdcp(p)->port + KBD_DATA_PORT); -} - -/* read one byte from the keyboard, but return immediately if - * no data is waiting - */ -static int -read_kbd_data_no_wait(KBDC p) -{ - if (inb(kbdcp(p)->port + KBD_STATUS_PORT) & KBDS_BUFFER_FULL) { - DELAY(KBDD_DELAYTIME); - return inb(kbdcp(p)->port + KBD_DATA_PORT); - } - return -1; /* no data */ -} diff --git a/sys/pc98/cbus/pckbdtables.h b/sys/pc98/cbus/pckbdtables.h deleted file mode 100644 index 5386f52174eb..000000000000 --- a/sys/pc98/cbus/pckbdtables.h +++ /dev/null @@ -1,203 +0,0 @@ -/*- - * Copyright (C) 2005 TAKAHASHI Yoshihiro. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * $FreeBSD$ - */ - -#ifndef KBD_DFLT_KEYMAP - -#define NO_ACCENTCHARS - -/* PC-9801 keymap by kuribo@isl.melco.co.jp */ -static keymap_t key_map = { 0x80, { /* PC98 keymap */ -/* alt - * scan cntrl alt alt cntrl - * code base shift cntrl shift alt shift cntrl shift spcl flgs - * --------------------------------------------------------------------------- - */ -{{/*00*/ 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, DBG, 0x1B }, 0x02,0x00 }, -{{/*01*/ '1', '!', '!', '!', '1', '!', '!', '!' }, 0x00,0x00 }, -{{/*02*/ '2', '\"', 0x1A, 0x1A, '2', '@', 0x00, 0x00 }, 0x00,0x00 }, -{{/*03*/ '3', '#', 0x1B, 0x1B, '3', '#', 0x1B, 0x1B }, 0x00,0x00 }, -{{/*04*/ '4', '$', 0x1C, 0x1C, '4', '$', 0x1C, 0x1C }, 0x00,0x00 }, -{{/*05*/ '5', '%', 0x1D, 0x1D, '5', '%', 0x1D, 0x1D }, 0x00,0x00 }, -{{/*06*/ '6', '&', 0x1E, 0x1E, '6', '^', 0x1E, 0x1E }, 0x00,0x00 }, -{{/*07*/ '7', '\'', 0x1F, 0x1F, '7', '&', '&', '&' }, 0x00,0x00 }, -{{/*08*/ '8', '(', 0x7F, 0x7F, '8', '*', 0x08, 0x08 }, 0x00,0x00 }, -{{/*09*/ '9', ')', '9', '9', '9', '(', '(', '(' }, 0x00,0x00 }, -{{/*0a*/ '0', NOP, '0', '0', '0', ')', ')', ')' }, 0x40,0x00 }, -{{/*0b*/ '-', '=', '-', '-', '-', '_', 0x1F, 0x1F }, 0x00,0x00 }, -{{/*0c*/ '^', '`', 0x1E, 0x1E, '=', '+', '+', '+' }, 0x00,0x00 }, -{{/*0d*/ '\\', '|', 0x1C, 0x1C, '\\', '|', 0x1C, 0x1C }, 0x00,0x00 }, -{{/*0e*/ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08 }, 0x00,0x00 }, -{{/*0f*/ '\t', BTAB, '\t', BTAB, '\t', BTAB, '\t', BTAB }, 0x55,0x00 }, -{{/*10*/ 'q', 'Q', 0x11, 0x11, 'q', 'Q', 0x11, 0x11 }, 0x00,0x01 }, -{{/*11*/ 'w', 'W', 0x17, 0x17, 'w', 'W', 0x17, 0x17 }, 0x00,0x01 }, -{{/*12*/ 'e', 'E', 0x05, 0x05, 'e', 'E', 0x05, 0x05 }, 0x00,0x01 }, -{{/*13*/ 'r', 'R', 0x12, 0x12, 'r', 'R', 0x12, 0x12 }, 0x00,0x01 }, -{{/*14*/ 't', 'T', 0x14, 0x14, 't', 'T', 0x14, 0x14 }, 0x00,0x01 }, -{{/*15*/ 'y', 'Y', 0x19, 0x19, 'y', 'Y', 0x19, 0x19 }, 0x00,0x01 }, -{{/*16*/ 'u', 'U', 0x15, 0x15, 'u', 'U', 0x15, 0x15 }, 0x00,0x01 }, -{{/*17*/ 'i', 'I', 0x09, 0x09, 'i', 'I', 0x09, 0x09 }, 0x00,0x01 }, -{{/*18*/ 'o', 'O', 0x0F, 0x0F, 'o', 'O', 0x0F, 0x0F }, 0x00,0x01 }, -{{/*19*/ 'p', 'P', 0x10, 0x10, 'p', 'P', 0x10, 0x10 }, 0x00,0x01 }, -{{/*1a*/ '@', '~', 0x00, 0x00, '[', '{', 0x1B, 0x1B }, 0x00,0x00 }, -{{/*1b*/ '[', '{', 0x1B, 0x1B, ']', '}', 0x1D, 0x1D }, 0x00,0x00 }, -{{/*1c*/ '\r', '\r', '\n', '\n', '\r', '\r', '\n', '\n' }, 0x00,0x00 }, -{{/*1d*/ 'a', 'A', 0x01, 0x01, 'a', 'A', 0x01, 0x01 }, 0x00,0x01 }, -{{/*1e*/ 's', 'S', 0x13, 0x13, 's', 'S', 0x13, 0x13 }, 0x00,0x01 }, -{{/*1f*/ 'd', 'D', 0x04, 0x04, 'd', 'D', 0x04, 0x04 }, 0x00,0x01 }, -{{/*20*/ 'f', 'F', 0x06, 0x06, 'f', 'F', 0x06, 0x06 }, 0x00,0x01 }, -{{/*21*/ 'g', 'G', 0x07, 0x07, 'g', 'G', 0x07, 0x07 }, 0x00,0x01 }, -{{/*22*/ 'h', 'H', 0x08, 0x08, 'h', 'H', 0x08, 0x08 }, 0x00,0x01 }, -{{/*23*/ 'j', 'J', '\n', '\n', 'j', 'J', '\n', '\n' }, 0x00,0x01 }, -{{/*24*/ 'k', 'K', 0x0B, 0x0B, 'k', 'K', 0x0B, 0x0B }, 0x00,0x01 }, -{{/*25*/ 'l', 'L', 0x0C, 0x0C, 'l', 'L', 0x0C, 0x0C }, 0x00,0x01 }, -{{/*26*/ ';', '+', ';', ';', ';', ':', ';', ';' }, 0x00,0x00 }, -{{/*27*/ ':', '*', ':', ':', '\'', '\"', '\'', '\'' }, 0x00,0x00 }, -{{/*28*/ ']', '}', 0x1D, 0x1D, '`', '~', '~', '~' }, 0x00,0x00 }, -{{/*29*/ 'z', 'Z', 0x1A, 0x1A, 'z', 'Z', 0x1A, 0x1A }, 0x00,0x01 }, -{{/*2a*/ 'x', 'X', 0x18, 0x18, 'x', 'X', 0x18, 0x18 }, 0x00,0x01 }, -{{/*2b*/ 'c', 'C', 0x03, 0x03, 'c', 'C', 0x03, 0x03 }, 0x00,0x01 }, -{{/*2c*/ 'v', 'V', 0x16, 0x16, 'v', 'V', 0x16, 0x16 }, 0x00,0x01 }, -{{/*2d*/ 'b', 'B', 0x02, 0x02, 'b', 'B', 0x02, 0x02 }, 0x00,0x01 }, -{{/*2e*/ 'n', 'N', 0x0E, 0x0E, 'n', 'N', 0x0E, 0x0E }, 0x00,0x01 }, -{{/*2f*/ 'm', 'M', '\r', '\r', 'm', 'M', '\r', '\r' }, 0x00,0x01 }, -{{/*30*/ ',', '<', '<', '<', ',', '<', '<', '<' }, 0x00,0x00 }, -{{/*31*/ '.', '>', '>', '>', '.', '>', '>', '>' }, 0x00,0x00 }, -{{/*32*/ '/', '?', 0x7F, 0x7F, '/', '?', 0x7F, 0x7F }, 0x00,0x00 }, -{{/*33*/ NOP, '_', 0x1F, 0x1F, '\\', '|', 0x1C, 0x1C }, 0x80,0x00 }, -{{/*34*/ ' ', ' ', 0x00, 0x00, ' ', ' ', 0x00, 0x00 }, 0x00,0x00 }, -{{/*35*/ 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B }, 0x00,0x00 }, -{{/*36*/ F(59), F(59), F(59), F(59), F(59), F(59), F(59), F(59) }, 0xFF,0x00 }, -{{/*37*/ F(51), F(51), F(51), F(51), F(51), F(51), F(51), F(51) }, 0xFF,0x00 }, -{{/*38*/ F(60), F(60), F(60), F(60), F(60), F(60), F(60), F(60) }, 0xFF,0x00 }, -{{/*39*/ 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, RBT, RBT }, 0x03,0x02 }, -{{/*3a*/ F(50), F(50), F(50), F(50), F(50), F(50), F(50), F(50) }, 0xFF,0x00 }, -{{/*3b*/ F(53), F(53), F(53), F(53), F(53), F(53), F(53), F(53) }, 0xFF,0x00 }, -{{/*3c*/ F(55), F(55), F(55), F(55), F(55), F(55), F(55), F(55) }, 0xFF,0x00 }, -{{/*3d*/ F(58), F(58), F(58), F(58), F(58), F(58), F(58), F(58) }, 0xFF,0x00 }, -{{/*3e*/ F(49), F(49), F(49), F(49), F(49), F(49), F(49), F(49) }, 0xFF,0x00 }, -{{/*3f*/ F(57), F(57), F(57), F(57), F(57), F(57), F(57), F(57) }, 0xFF,0x00 }, -{{/*40*/ '-', '-', '-', '-', '-', '-', '-', '-' }, 0x00,0x00 }, -{{/*41*/ '/', '/', '/', '/', '/', '/', '/', '/' }, 0x00,0x00 }, -{{/*42*/ '7', '7', '7', '7', '7', '7', '7', '7' }, 0x00,0x00 }, -{{/*43*/ '8', '8', '8', '8', '8', '8', '8', '8' }, 0x00,0x00 }, -{{/*44*/ '9', '9', '9', '9', '9', '9', '9', '9' }, 0x00,0x00 }, -{{/*45*/ '*', '*', '*', '*', '*', '*', '*', '*' }, 0x00,0x00 }, -{{/*46*/ '4', '4', '4', '4', '4', '4', '4', '4' }, 0x00,0x00 }, -{{/*47*/ '5', '5', '5', '5', '5', '5', '5', '5' }, 0x00,0x00 }, -{{/*48*/ '6', '6', '6', '6', '6', '6', '6', '6' }, 0x00,0x00 }, -{{/*49*/ '+', '+', '+', '+', '+', '+', '+', '+' }, 0x00,0x00 }, -{{/*4a*/ '1', '1', '1', '1', '1', '1', '1', '1' }, 0x00,0x00 }, -{{/*4b*/ '2', '2', '2', '2', '2', '2', '2', '2' }, 0x00,0x00 }, -{{/*4c*/ '3', '3', '3', '3', '3', '3', '3', '3' }, 0x00,0x00 }, -{{/*4d*/ '=', '=', '=', '=', '=', '=', '=', '=' }, 0x00,0x00 }, -{{/*4e*/ '0', '0', '0', '0', '0', '0', '0', '0' }, 0x00,0x00 }, -{{/*4f*/ ',', ',', ',', ',', ',', ',', ',', ',' }, 0x00,0x00 }, -{{/*50*/ '.', '.', '.', '.', '.', '.', '.', '.' }, 0x00,0x00 }, -{{/*51*/ META, META, META, META, META, META, META, META }, 0xFF,0x00 }, -{{/*52*/ F(11), F(23), F(35), F(47), S(11), S(11), S(11), S(11) }, 0xFF,0x00 }, -{{/*53*/ F(12), F(24), F(36), F(48), S(12), S(12), S(12), S(12) }, 0xFF,0x00 }, -{{/*54*/ SLK, SLK, SLK, SLK, SLK, SLK, SLK, SLK }, 0xFF,0x00 }, -{{/*55*/ NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP }, 0xFF,0x00 }, -{{/*56*/ NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP }, 0xFF,0x00 }, -{{/*57*/ NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP }, 0xFF,0x00 }, -{{/*58*/ NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP }, 0xFF,0x00 }, -{{/*59*/ NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP }, 0xFF,0x00 }, -{{/*5a*/ NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP }, 0xFF,0x00 }, -{{/*5b*/ NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP }, 0xFF,0x00 }, -{{/*5c*/ NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP }, 0xFF,0x00 }, -{{/*5d*/ NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP }, 0xFF,0x00 }, -{{/*5e*/ NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP }, 0xFF,0x00 }, -{{/*5f*/ NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP }, 0xFF,0x00 }, -{{/*60*/ SLK, SPSC, SLK, SPSC, SUSP, NOP, SUSP, NOP }, 0xFF,0x00 }, -{{/*61*/ NEXT, NEXT, DBG, DBG, NOP, NOP, NOP, NOP }, 0xFF,0x00 }, -{{/*62*/ F( 1), F(13), F(25), F(37), S( 1), S( 1), S( 1), S( 1) }, 0xFF,0x00 }, -{{/*63*/ F( 2), F(14), F(26), F(38), S( 2), S( 2), S( 2), S( 2) }, 0xFF,0x00 }, -{{/*64*/ F( 3), F(15), F(27), F(39), S( 3), S( 3), S( 3), S( 3) }, 0xFF,0x00 }, -{{/*65*/ F( 4), F(16), F(28), F(40), S( 4), S( 4), S( 4), S( 4) }, 0xFF,0x00 }, -{{/*66*/ F( 5), F(17), F(29), F(41), S( 5), S( 5), S( 5), S( 5) }, 0xFF,0x00 }, -{{/*67*/ F( 6), F(18), F(30), F(42), S( 6), S( 6), S( 6), S( 6) }, 0xFF,0x00 }, -{{/*68*/ F( 7), F(19), F(31), F(43), S( 7), S( 7), S( 7), S( 7) }, 0xFF,0x00 }, -{{/*69*/ F( 8), F(20), F(32), F(44), S( 8), S( 8), S( 8), S( 8) }, 0xFF,0x00 }, -{{/*6a*/ F( 9), F(21), F(33), F(45), S( 9), S( 9), S( 9), S( 9) }, 0xFF,0x00 }, -{{/*6b*/ F(10), F(22), F(34), F(46), S(10), S(10), S(10), S(10) }, 0xFF,0x00 }, -{{/*6c*/ NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP }, 0xFF,0x00 }, -{{/*6d*/ NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP }, 0xFF,0x00 }, -{{/*6e*/ NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP }, 0xFF,0x00 }, -{{/*6f*/ NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP }, 0xFF,0x00 }, -{{/*70*/ LSH, LSH, LSH, LSH, LSH, LSH, LSH, LSH }, 0xFF,0x00 }, -{{/*71*/ CLK, CLK, CLK, CLK, CLK, CLK, CLK, CLK }, 0xFF,0x00 }, -{{/*72*/ LALT, LALT, LALT, LALT, LALT, LALT, LALT, LALT }, 0xFF,0x00 }, -{{/*73*/ LALT, LALT, LALT, LALT, LALT, LALT, LALT, LALT }, 0xFF,0x00 }, -{{/*74*/ LCTR, LCTR, LCTR, LCTR, LCTR, LCTR, LCTR, LCTR }, 0xFF,0x00 }, -{{/*75*/ NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP }, 0xFF,0x00 }, -{{/*76*/ NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP }, 0xFF,0x00 }, -{{/*77*/ NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP }, 0xFF,0x00 }, -{{/*78*/ NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP }, 0xFF,0x00 }, -{{/*79*/ NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP }, 0xFF,0x00 }, -{{/*7a*/ NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP }, 0xFF,0x00 }, -{{/*7b*/ NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP }, 0xFF,0x00 }, -{{/*7c*/ NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP }, 0xFF,0x00 }, -{{/*7d*/ NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP }, 0xFF,0x00 }, -{{/*7e*/ NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP }, 0xFF,0x00 }, -{{/*7f*/ NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP }, 0xFF,0x00 }, -} }; - -static accentmap_t accent_map = { 0, /* empty accent map */ - { - { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, - { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, - } -}; - -#endif /* !KBD_DFLT_KEYMAP */ - -static fkeytab_t fkey_tab[96] = { -/* 01-04 */ {"\033[M", 3}, {"\033[N", 3}, {"\033[O", 3}, {"\033[P", 3}, -/* 05-08 */ {"\033[Q", 3}, {"\033[R", 3}, {"\033[S", 3}, {"\033[T", 3}, -/* 09-12 */ {"\033[U", 3}, {"\033[V", 3}, {"\033[W", 3}, {"\033[X", 3}, -/* 13-16 */ {"\033[Y", 3}, {"\033[Z", 3}, {"\033[a", 3}, {"\033[b", 3}, -/* 17-20 */ {"\033[c", 3}, {"\033[d", 3}, {"\033[e", 3}, {"\033[f", 3}, -/* 21-24 */ {"\033[g", 3}, {"\033[h", 3}, {"\033[i", 3}, {"\033[j", 3}, -/* 25-28 */ {"\033[k", 3}, {"\033[l", 3}, {"\033[m", 3}, {"\033[n", 3}, -/* 29-32 */ {"\033[o", 3}, {"\033[p", 3}, {"\033[q", 3}, {"\033[r", 3}, -/* 33-36 */ {"\033[s", 3}, {"\033[t", 3}, {"\033[u", 3}, {"\033[v", 3}, -/* 37-40 */ {"\033[w", 3}, {"\033[x", 3}, {"\033[y", 3}, {"\033[z", 3}, -/* 41-44 */ {"\033[@", 3}, {"\033[[", 3}, {"\033[\\",3}, {"\033[]", 3}, -/* 45-48 */ {"\033[^", 3}, {"\033[_", 3}, {"\033[`", 3}, {"\033[{", 3}, -/* 49-52 */ {"\033[H", 3}, {"\033[A", 3}, {"\033[I", 3}, {"-" , 1}, -/* 53-56 */ {"\033[D", 3}, {"\033[E", 3}, {"\033[C", 3}, {"+" , 1}, -/* 57-60 */ {"\033[F", 3}, {"\033[B", 3}, {"\033[G", 3}, {"\033[L", 3}, -/* 61-64 */ {"\177", 1}, {"\033[J", 3}, {"\033[~", 3}, {"\033[}", 3}, -/* 65-68 */ {"", 0} , {"", 0} , {"", 0} , {"", 0} , -/* 69-72 */ {"", 0} , {"", 0} , {"", 0} , {"", 0} , -/* 73-76 */ {"", 0} , {"", 0} , {"", 0} , {"", 0} , -/* 77-80 */ {"", 0} , {"", 0} , {"", 0} , {"", 0} , -/* 81-84 */ {"", 0} , {"", 0} , {"", 0} , {"", 0} , -/* 85-88 */ {"", 0} , {"", 0} , {"", 0} , {"", 0} , -/* 89-92 */ {"", 0} , {"", 0} , {"", 0} , {"", 0} , -/* 93-96 */ {"", 0} , {"", 0} , {"", 0} , {"", 0} -}; diff --git a/sys/pc98/cbus/pcrtc.c b/sys/pc98/cbus/pcrtc.c deleted file mode 100644 index 6fcbf57fbc63..000000000000 --- a/sys/pc98/cbus/pcrtc.c +++ /dev/null @@ -1,249 +0,0 @@ -/*- - * Copyright (c) 2008 TAKAHASHI Yoshihiro - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#include <sys/param.h> -#include <sys/systm.h> -#include <sys/bus.h> -#include <sys/clock.h> -#include <sys/kernel.h> -#include <sys/module.h> - -#include <pc98/cbus/cbus.h> -#include <isa/isavar.h> - -/* - * modified for PC98 by Kakefuda - */ - -/* - * RTC support routines - */ - -static void rtc_serialcombit(int); -static void rtc_serialcom(int); -static int rtc_inb(void); -static void rtc_outb(int); - -static void -rtc_serialcombit(int i) -{ - outb(IO_RTC, ((i&0x01)<<5)|0x07); - DELAY(1); - outb(IO_RTC, ((i&0x01)<<5)|0x17); - DELAY(1); - outb(IO_RTC, ((i&0x01)<<5)|0x07); - DELAY(1); -} - -static void -rtc_serialcom(int i) -{ - rtc_serialcombit(i&0x01); - rtc_serialcombit((i&0x02)>>1); - rtc_serialcombit((i&0x04)>>2); - rtc_serialcombit((i&0x08)>>3); - outb(IO_RTC, 0x07); - DELAY(1); - outb(IO_RTC, 0x0f); - DELAY(1); - outb(IO_RTC, 0x07); - DELAY(1); -} - -static void -rtc_outb(int val) -{ - int s; - int sa = 0; - - for (s=0;s<8;s++) { - sa = ((val >> s) & 0x01) ? 0x27 : 0x07; - outb(IO_RTC, sa); /* set DI & CLK 0 */ - DELAY(1); - outb(IO_RTC, sa | 0x10); /* CLK 1 */ - DELAY(1); - } - outb(IO_RTC, sa & 0xef); /* CLK 0 */ -} - -static int -rtc_inb(void) -{ - int s; - int sa = 0; - - for (s=0;s<8;s++) { - sa |= ((inb(0x33) & 0x01) << s); - outb(IO_RTC, 0x17); /* CLK 1 */ - DELAY(1); - outb(IO_RTC, 0x07); /* CLK 0 */ - DELAY(2); - } - return sa; -} - -/********************************************************************** - * RTC driver for subr_rtc - */ - -#include "clock_if.h" - -#include <sys/rman.h> - -struct pcrtc_softc { - int port_rid1, port_rid2; - struct resource *port_res1, *port_res2; -}; - -/* - * Attach to the ISA PnP descriptors for the timer and realtime clock. - */ -static struct isa_pnp_id pcrtc_ids[] = { - { 0x000bd041 /* PNP0B00 */, "AT realtime clock" }, - { 0 } -}; - -static int -pcrtc_probe(device_t dev) -{ - int result; - - device_set_desc(dev, "PC Real Time Clock"); - result = ISA_PNP_PROBE(device_get_parent(dev), dev, pcrtc_ids); - /* ENXIO if wrong PnP-ID, ENOENT ifno PnP-ID, zero if good PnP-iD */ - if (result != ENOENT) - return(result); - /* All PC's have an RTC, and we're hosed without it, so... */ - return (BUS_PROBE_LOW_PRIORITY); -} - -static int -pcrtc_attach(device_t dev) -{ - struct pcrtc_softc *sc; - - /* - * Not that we need them or anything, but grab our resources - * so they show up, correctly attributed, in the big picture. - */ - sc = device_get_softc(dev); - sc->port_rid1 = 0; - bus_set_resource(dev, SYS_RES_IOPORT, sc->port_rid1, IO_RTC, 1); - if (!(sc->port_res1 = bus_alloc_resource(dev, SYS_RES_IOPORT, - &sc->port_rid1, IO_RTC, IO_RTC, 1, RF_ACTIVE))) - device_printf(dev, "Warning: Couldn't map I/O.\n"); - sc->port_rid2 = 1; - bus_set_resource(dev, SYS_RES_IOPORT, sc->port_rid2, 0x33, 1); - if (!(sc->port_res2 = bus_alloc_resource(dev, SYS_RES_IOPORT, - &sc->port_rid2, 0x33, 0x33, 1, RF_ACTIVE))) - device_printf(dev, "Warning: Couldn't map I/O.\n"); - - clock_register(dev, 1000000); - return(0); -} - -static int -pcrtc_settime(device_t dev __unused, struct timespec *ts) -{ - struct clocktime ct; - - clock_ts_to_ct(ts, &ct); - - rtc_serialcom(0x01); /* Register shift command. */ - - rtc_outb(bin2bcd(ct.sec)); /* Write back Seconds */ - rtc_outb(bin2bcd(ct.min)); /* Write back Minutes */ - rtc_outb(bin2bcd(ct.hour)); /* Write back Hours */ - - rtc_outb(bin2bcd(ct.day)); /* Write back Day */ - rtc_outb((ct.mon << 4) | ct.dow); /* Write back Month and DOW */ - rtc_outb(bin2bcd(ct.year % 100)); /* Write back Year */ - - rtc_serialcom(0x02); /* Time set & Counter hold command. */ - rtc_serialcom(0x00); /* Register hold command. */ - - return (0); -} - -static int -pcrtc_gettime(device_t dev, struct timespec *ts) -{ - struct clocktime ct; - int i; - - rtc_serialcom(0x03); /* Time Read */ - rtc_serialcom(0x01); /* Register shift command. */ - DELAY(20); - - ct.nsec = 0; - ct.sec = bcd2bin(rtc_inb() & 0xff); /* sec */ - ct.min = bcd2bin(rtc_inb() & 0xff); /* min */ - ct.hour = bcd2bin(rtc_inb() & 0xff); /* hour */ - ct.day = bcd2bin(rtc_inb() & 0xff); /* date */ - i = rtc_inb(); - ct.dow = i & 0x0f; /* dow */ - ct.mon = (i >> 4) & 0x0f; /* month */ - ct.year = bcd2bin(rtc_inb() & 0xff) + 1900; /* year */ - if (ct.year < 1995) - ct.year += 100; - - /* Set dow = -1 because some clocks don't set it correctly. */ - ct.dow = -1; - - return (clock_ct_to_ts(&ct, ts)); -} - -static device_method_t pcrtc_methods[] = { - /* Device interface */ - DEVMETHOD(device_probe, pcrtc_probe), - DEVMETHOD(device_attach, pcrtc_attach), - DEVMETHOD(device_detach, bus_generic_detach), - DEVMETHOD(device_shutdown, bus_generic_shutdown), - DEVMETHOD(device_suspend, bus_generic_suspend), - /* XXX stop statclock? */ - DEVMETHOD(device_resume, bus_generic_resume), - /* XXX restart statclock? */ - - /* clock interface */ - DEVMETHOD(clock_gettime, pcrtc_gettime), - DEVMETHOD(clock_settime, pcrtc_settime), - - { 0, 0 } -}; - -static driver_t pcrtc_driver = { - "pcrtc", - pcrtc_methods, - sizeof(struct pcrtc_softc), -}; - -static devclass_t pcrtc_devclass; - -DRIVER_MODULE(pcrtc, isa, pcrtc_driver, pcrtc_devclass, 0, 0); diff --git a/sys/pc98/cbus/pmc.c b/sys/pc98/cbus/pmc.c deleted file mode 100644 index ad59767c1f3f..000000000000 --- a/sys/pc98/cbus/pmc.c +++ /dev/null @@ -1,244 +0,0 @@ -/*- - * PMC (Power Management Controller of NEC PC-98Note) Driver - * - * Copyright (c) 2001 Chiharu Shibata. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * $FreeBSD$ - */ - -#include <sys/param.h> -#include <sys/systm.h> -#include <sys/eventhandler.h> -#include <sys/kernel.h> -#include <sys/module.h> -#include <sys/bus.h> -#include <sys/types.h> -#include <sys/conf.h> -#include <sys/reboot.h> - -#include <machine/bus.h> -#include <machine/resource.h> -#include <sys/rman.h> - -#include <isa/isavar.h> - -struct pmc_isa_softc { - struct resource *port_res; - eventhandler_tag evt; - int flags; -}; - -static int pmc_isa_alloc_resources(device_t); -static void pmc_isa_release_resources(device_t); -static int pmc_isa_probe(device_t); -static int pmc_isa_attach(device_t); -static int pmc_isa_detach(device_t); - -#define PMC_ISA_PORT 0x8f0 -#define PMC_ISA_PORTSIZE 4 - -#define sc_inw(sc, port) \ - bus_space_read_2(rman_get_bustag((sc)->port_res), \ - rman_get_bushandle((sc)->port_res), (port)) - -#define sc_outw(sc, port, value) \ - bus_space_write_2(rman_get_bustag((sc)->port_res), \ - rman_get_bushandle((sc)->port_res), (port), (value)) - -static void -pmc_poweroff(void *arg, int howto) -{ - struct pmc_isa_softc *sc = (struct pmc_isa_softc *)arg; - - if (!sc->flags) { - outb(0x5e8e, inb(0x5e8e) & ~0x11); /* FDD LED off */ - } - - if (!(howto & RB_POWEROFF)) { - return; - } - - sc_outw(sc, 0, 0x0044); - sc_outw(sc, 2, 1 << 10); -#if 1 - /* for 9801NS/T */ - sc_outw(sc, 0, 0xf00a); - sc_outw(sc, 2, 1 << 9); -#endif -} - -static int -pmc_isa_alloc_resources(device_t dev) -{ - struct pmc_isa_softc *sc = device_get_softc(dev); - int rid; - - bzero(sc, sizeof(*sc)); - - rid = 0; - sc->port_res = bus_alloc_resource_anywhere(dev, SYS_RES_IOPORT, &rid, - PMC_ISA_PORTSIZE, RF_ACTIVE); - if (sc->port_res == NULL) { - return (ENOMEM); - } - - return 0; -} - -static void -pmc_isa_release_resources(device_t dev) -{ - struct pmc_isa_softc *sc = device_get_softc(dev); - - if (sc->port_res != NULL) { - bus_release_resource(dev, SYS_RES_IOPORT, 0, sc->port_res); - } - sc->port_res = NULL; -} - -static int -pmc_isa_probe(device_t dev) -{ - struct pmc_isa_softc *sc = device_get_softc(dev); - u_int port; - u_int16_t save, tmp; - -#if 0 - if (isa_get_vendorid(dev)) { - return ENXIO; - } - if (device_get_unit(dev) > 0) { - printf("pmc: Only one PMC driver supported.\n"); - return ENXIO; - } -#endif - port = isa_get_port(dev); - if (port == -1) { - port = PMC_ISA_PORT; - } - if (bootverbose) { - device_printf(dev, "port = 0x%x\n", port); - } - - if (bus_set_resource(dev, SYS_RES_IOPORT, 0, port, PMC_ISA_PORTSIZE)) { - if (bootverbose) { - device_printf(dev, "bus_set_resource failed\n"); - } - return ENXIO; - } - if (pmc_isa_alloc_resources(dev)) { - if (bootverbose) { - device_printf(dev, "pmc_isa_alloc_resources failed\n"); - } - return ENXIO; - } - - /* Check the existence of PMC */ - sc_outw(sc, 0, 0x0052); - save = sc_inw(sc, 2); - tmp = save & ~0x3f; - sc_outw(sc, 2, tmp); - if (sc_inw(sc, 2) != tmp) { - if (bootverbose) { - device_printf(dev, "failed to clear index(0x0052)\n"); - } - - pmc_isa_release_resources(dev); - return ENXIO; - } - - tmp |= 0x3e; - sc_outw(sc, 2, tmp); - if (sc_inw(sc, 2) != tmp) { - if (bootverbose) { - device_printf(dev, "failed to set index(0x0052)\n"); - } - - pmc_isa_release_resources(dev); - return ENXIO; - } - sc_outw(sc, 2, save); - - pmc_isa_release_resources(dev); - - device_set_desc(dev, "Power Management Controller"); - return 0; -} - -static int -pmc_isa_attach(device_t dev) -{ - struct pmc_isa_softc *sc = device_get_softc(dev); - int error; - - error = pmc_isa_alloc_resources(dev); - if (error) { - device_printf(dev, "resource allocation failed\n"); - return error; - } - - /* Power the system off using PMC */ - sc->evt = EVENTHANDLER_REGISTER(shutdown_final, pmc_poweroff, sc, - SHUTDOWN_PRI_LAST); - sc->flags = device_get_flags(dev); - return 0; -} - -static int -pmc_isa_detach(device_t dev) -{ - struct pmc_isa_softc *sc = device_get_softc(dev); - - if (bootverbose) { - device_printf(dev, "pmc_isa_detach called\n"); - } - - if (sc->evt != NULL) { - EVENTHANDLER_DEREGISTER(shutdown_final, sc->evt); - } - sc->evt = NULL; - - pmc_isa_release_resources(dev); - return 0; -} - -static device_method_t pmc_isa_methods[] = { - /* Device interface */ - DEVMETHOD(device_probe, pmc_isa_probe), - DEVMETHOD(device_attach, pmc_isa_attach), - DEVMETHOD(device_detach, pmc_isa_detach), - {0, 0} -}; - -static driver_t pmc_isa_driver = { - "pmc", - pmc_isa_methods, sizeof(struct pmc_isa_softc), -}; - -devclass_t pmc_devclass; - -DRIVER_MODULE(pmc, isa, pmc_isa_driver, pmc_devclass, 0, 0); diff --git a/sys/pc98/cbus/sc_machdep.h b/sys/pc98/cbus/sc_machdep.h deleted file mode 100644 index 5dbc94eb182c..000000000000 --- a/sys/pc98/cbus/sc_machdep.h +++ /dev/null @@ -1,52 +0,0 @@ -/*- - * Copyright (c) 1999 FreeBSD(98) Porting Team. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer as - * the first lines of this file unmodified. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD$ - */ - -#ifndef _PC98_PC98_SC_MACHDEP_H_ -#define _PC98_PC98_SC_MACHDEP_H_ - -#undef SC_DFLT_FONT -#undef SC_MOUSE_CHAR -#undef SC_PIXEL_MODE -#undef SC_NO_FONT_LOADING -#define SC_NO_FONT_LOADING 1 -#undef SC_NO_PALETTE_LOADING -#define SC_NO_PALETTE_LOADING 1 - -#ifndef SC_KERNEL_CONS_ATTR -#define SC_KERNEL_CONS_ATTR (FG_LIGHTGREY | BG_BLACK) -#endif - -#define KANJI 1 - -#define UJIS 0 -#define SJIS 1 - -#define PRINTABLE(c) ((c) > 0x1b || ((c) > 0x0f && (c) < 0x1b) \ - || (c) < 0x07) - -#endif /* !_PC98_PC98_SC_MACHDEP_H_ */ diff --git a/sys/pc98/cbus/scgdcrndr.c b/sys/pc98/cbus/scgdcrndr.c deleted file mode 100644 index 53ff41ebc300..000000000000 --- a/sys/pc98/cbus/scgdcrndr.c +++ /dev/null @@ -1,208 +0,0 @@ -/*- - * Copyright (c) 1999 FreeBSD(98) Porting Team. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer as - * the first lines of this file unmodified. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD$ - */ - -#include "opt_syscons.h" -#include "opt_gdc.h" - -#include <sys/param.h> -#include <sys/systm.h> -#include <sys/kernel.h> -#include <sys/module.h> -#include <sys/fbio.h> -#include <sys/consio.h> - -#include <dev/fb/fbreg.h> -#include <dev/syscons/syscons.h> - -#ifndef SC_RENDER_DEBUG -#define SC_RENDER_DEBUG 0 -#endif - -static vr_clear_t gdc_txtclear; -static vr_draw_border_t gdc_txtborder; -static vr_draw_t gdc_txtdraw; -static vr_set_cursor_t gdc_txtcursor_shape; -static vr_draw_cursor_t gdc_txtcursor; -#ifndef SC_NO_CUTPASTE -static vr_draw_mouse_t gdc_txtmouse; -#else -#define gdc_txtmouse (vr_draw_mouse_t *)gdc_nop -#endif - -#ifndef SC_NO_MODE_CHANGE -static vr_draw_border_t gdc_grborder; -#endif - -static void gdc_nop(scr_stat *scp, ...); - -static sc_rndr_sw_t txtrndrsw = { - (vr_init_t *)gdc_nop, - gdc_txtclear, - gdc_txtborder, - gdc_txtdraw, - gdc_txtcursor_shape, - gdc_txtcursor, - (vr_blink_cursor_t *)gdc_nop, - (vr_set_mouse_t *)gdc_nop, - gdc_txtmouse, -}; -RENDERER(gdc, 0, txtrndrsw, gdc_set); - -#ifndef SC_NO_MODE_CHANGE -static sc_rndr_sw_t grrndrsw = { - (vr_init_t *)gdc_nop, - (vr_clear_t *)gdc_nop, - gdc_grborder, - (vr_draw_t *)gdc_nop, - (vr_set_cursor_t *)gdc_nop, - (vr_draw_cursor_t *)gdc_nop, - (vr_blink_cursor_t *)gdc_nop, - (vr_set_mouse_t *)gdc_nop, - (vr_draw_mouse_t *)gdc_nop, -}; -RENDERER(gdc, GRAPHICS_MODE, grrndrsw, gdc_set); -#endif /* SC_NO_MODE_CHANGE */ - -RENDERER_MODULE(gdc, gdc_set); - -static void -gdc_nop(scr_stat *scp, ...) -{ -} - -/* text mode renderer */ - -static void -gdc_txtclear(scr_stat *scp, int c, int attr) -{ - sc_vtb_clear(&scp->scr, c, attr); -} - -static void -gdc_txtborder(scr_stat *scp, int color) -{ - vidd_set_border(scp->sc->adp, color); -} - -static void -gdc_txtdraw(scr_stat *scp, int from, int count, int flip) -{ - vm_offset_t p; - int c; - int a; - - if (from + count > scp->xsize*scp->ysize) - count = scp->xsize*scp->ysize - from; - - if (flip) { - for (p = sc_vtb_pointer(&scp->scr, from); count-- > 0; ++from) { - c = sc_vtb_getc(&scp->vtb, from); - a = sc_vtb_geta(&scp->vtb, from); -#if 0 - a ^= 0x0800; -#else - a = (a & 0x8800) | ((a & 0x7000) >> 4) - | ((a & 0x0700) << 4); -#endif - p = sc_vtb_putchar(&scp->scr, p, c, a); - } - } else { - sc_vtb_copy(&scp->vtb, from, &scp->scr, from, count); - } -} - -static void -gdc_txtcursor_shape(scr_stat *scp, int base, int height, int blink) -{ - if (base < 0 || base >= scp->font_size) - return; - /* the caller may set height <= 0 in order to disable the cursor */ - vidd_set_hw_cursor_shape(scp->sc->adp, base, height, scp->font_size, - blink); -} - -static void -gdc_txtcursor(scr_stat *scp, int at, int blink, int on, int flip) -{ - if (on) { - scp->status |= VR_CURSOR_ON; - vidd_set_hw_cursor(scp->sc->adp, at%scp->xsize, - at/scp->xsize); - } else { - if (scp->status & VR_CURSOR_ON) - vidd_set_hw_cursor(scp->sc->adp, -1, -1); - scp->status &= ~VR_CURSOR_ON; - } -} - -#ifndef SC_NO_CUTPASTE - -static void -draw_txtmouse(scr_stat *scp, int x, int y) -{ - int at; - int a; - - at = (y/scp->font_size - scp->yoff)*scp->xsize + x/8 - scp->xoff; - a = sc_vtb_geta(&scp->vtb, at); -#if 0 - a ^= 0x0800; -#else - a = (a & 0x8800) | ((a & 0x7000) >> 4) - | ((a & 0x0700) << 4); -#endif - sc_vtb_putc(&scp->scr, at, sc_vtb_getc(&scp->scr, at), a); -} - -static void -remove_txtmouse(scr_stat *scp, int x, int y) -{ -} - -static void -gdc_txtmouse(scr_stat *scp, int x, int y, int on) -{ - if (on) - draw_txtmouse(scp, x, y); - else - remove_txtmouse(scp, x, y); -} - -#endif /* SC_NO_CUTPASTE */ - -#ifndef SC_NO_MODE_CHANGE - -/* graphics mode renderer */ - -static void -gdc_grborder(scr_stat *scp, int color) -{ - vidd_set_border(scp->sc->adp, color); -} - -#endif /* SC_NO_MODE_CHANGE */ diff --git a/sys/pc98/cbus/scterm-sck.c b/sys/pc98/cbus/scterm-sck.c deleted file mode 100644 index a7615d6f5886..000000000000 --- a/sys/pc98/cbus/scterm-sck.c +++ /dev/null @@ -1,1229 +0,0 @@ -/*- - * Copyright (c) 1999 FreeBSD(98) Porting Team. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer as - * the first lines of this file unmodified. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD$ - */ - -#include "opt_syscons.h" - -#include <sys/param.h> -#include <sys/systm.h> -#include <sys/kernel.h> -#include <sys/module.h> -#include <sys/consio.h> - -#include <machine/pc/display.h> - -#include <dev/syscons/syscons.h> -#include <pc98/cbus/sctermvar.h> - -#define MAX_ESC_PAR 5 - -#ifdef KANJI -#define IS_KTYPE_ASCII_or_HANKAKU(A) (!((A) & 0xee)) -#define IS_KTYPE_KANA(A) ((A) & 0x11) -#define KTYPE_MASK_CTRL(A) ((A) &= 0xF0) -#endif /* KANJI */ - -/* attribute flags */ -typedef struct { - u_short fg; /* foreground color */ - u_short bg; /* background color */ -} color_t; - -typedef struct { - int flags; -#define SCTERM_BUSY (1 << 0) - int esc; - int num_param; - int last_param; - int param[MAX_ESC_PAR]; - int saved_xpos; - int saved_ypos; - -#ifdef KANJI - u_char kanji_1st_char; - u_char kanji_type; -#define KTYPE_ASCII 0 /* ASCII */ -#define KTYPE_KANA 1 /* HANKAKU */ -#define KTYPE_JKANA 0x10 /* JIS HANKAKU */ -#define KTYPE_7JIS 0x20 /* JIS */ -#define KTYPE_SJIS 2 /* Shift JIS */ -#define KTYPE_UJIS 4 /* UJIS */ -#define KTYPE_SUKANA 3 /* Shift JIS or UJIS HANKAKU */ -#define KTYPE_SUJIS 6 /* SHift JIS or UJIS */ -#define KTYPE_KANIN 0x80 /* Kanji Invoke sequence */ -#define KTYPE_ASCIN 0x40 /* ASCII Invoke sequence */ -#endif /* KANJI */ - - int attr_mask; /* current logical attr mask */ -#define NORMAL_ATTR 0x00 -#define BLINK_ATTR 0x01 -#define BOLD_ATTR 0x02 -#define UNDERLINE_ATTR 0x04 -#define REVERSE_ATTR 0x08 -#define FG_CHANGED 0x10 -#define BG_CHANGED 0x20 - int cur_attr; /* current hardware attr word */ - color_t cur_color; /* current hardware color */ - color_t std_color; /* normal hardware color */ - color_t rev_color; /* reverse hardware color */ - color_t dflt_std_color; /* default normal color */ - color_t dflt_rev_color; /* default reverse color */ -} term_stat; - -static sc_term_init_t scterm_init; -static sc_term_term_t scterm_term; -static sc_term_puts_t scterm_puts; -static sc_term_ioctl_t scterm_ioctl; -static sc_term_reset_t scterm_reset; -static sc_term_default_attr_t scterm_default_attr; -static sc_term_clear_t scterm_clear; -static sc_term_notify_t scterm_notify; -static sc_term_input_t scterm_input; -static sc_term_fkeystr_t scterm_fkeystr; - -static sc_term_sw_t sc_term_sc = { - { NULL, NULL }, - "sck", /* emulator name */ - "syscons kanji terminal", /* description */ - "*", /* matching renderer, any :-) */ - sizeof(term_stat), /* softc size */ - 0, - scterm_init, - scterm_term, - scterm_puts, - scterm_ioctl, - scterm_reset, - scterm_default_attr, - scterm_clear, - scterm_notify, - scterm_input, - scterm_fkeystr, -}; - -SCTERM_MODULE(sc, sc_term_sc); - -static term_stat reserved_term_stat; -static int default_kanji = UJIS; -static void scterm_scan_esc(scr_stat *scp, term_stat *tcp, - u_char c); -static int mask2attr(term_stat *tcp); - -#ifdef KANJI -static inline u_char -iskanji1(u_char mode, u_char c) -{ - if (c > 0x80) { - if ((c >= 0xa1) && (c <= 0xdf)) { - if (default_kanji == UJIS) { - /* UJIS */ - return KTYPE_UJIS; - } - if (default_kanji == SJIS) { - /* SJIS HANKAKU */ - return KTYPE_KANA; - } - } - - if (c <= 0x9f) { - if (c == 0x8e) { - /* SJIS or UJIS HANKAKU */ - return KTYPE_SUKANA; - } - - /* SJIS */ - default_kanji = SJIS; - return KTYPE_SJIS; - } - - if ((c >= 0xe0) && (c <= 0xef)) { - /* SJIS or UJIS */ - return KTYPE_SUJIS; - } - - if ((c >= 0xf0) && (c <= 0xfe)) { - /* UJIS */ - default_kanji = UJIS; - return KTYPE_UJIS; - } - } else { - if ((mode == KTYPE_7JIS) && (c >= 0x21) && (c <= 0x7e)) { - /* JIS */ - default_kanji = UJIS; - return KTYPE_7JIS; - } - - if ((mode == KTYPE_JKANA) && (c >= 0x21) && (c <= 0x5f)) { - /* JIS HANKAKU */ - default_kanji = UJIS; - return KTYPE_JKANA; - } - } - - return KTYPE_ASCII; -} - -static inline u_char -iskanji2(u_char mode, u_char c) -{ - switch (mode) { - case KTYPE_7JIS: - if ((c >= 0x21) && (c <= 0x7e)) { - /* JIS */ - return KTYPE_7JIS; - } - break; - case KTYPE_SJIS: - if ((c >= 0x40) && (c <= 0xfc) && (c != 0x7f)) { - /* SJIS */ - return KTYPE_SJIS; - } - break; - case KTYPE_UJIS: - if ((c >= 0xa1) && (c <= 0xfe)) { - /* UJIS */ - return KTYPE_UJIS; - } - break; - case KTYPE_SUKANA: - if ((c >= 0xa1) && (c <= 0xdf) && (default_kanji == UJIS)) { - /* UJIS HANKAKU */ - return KTYPE_KANA; - } - if ((c >= 0x40) && (c <= 0xfc) && (c != 0x7f)) { - /* SJIS */ - default_kanji = SJIS; - return KTYPE_SJIS; - } - break; - case KTYPE_SUJIS: - if ((c >= 0x40) && (c <= 0xa0) && (c != 0x7f)) { - /* SJIS */ - default_kanji = SJIS; - return KTYPE_SJIS; - } - if ((c == 0xfd) || (c == 0xfe)) { - /* UJIS */ - default_kanji = UJIS; - return KTYPE_UJIS; - } - if ((c >= 0xa1) && (c <= 0xfc)) { - if (default_kanji == SJIS) - return KTYPE_SJIS; - if (default_kanji == UJIS) - return KTYPE_UJIS; - } - break; - } - - return KTYPE_ASCII; -} - -/* - * JIS X0208-83 keisen conversion table - */ -static u_short keiConv[32] = { - 0x240c, 0x260c, 0x300c, 0x340c, 0x3c0c, 0x380c, 0x400c, 0x500c, - 0x480c, 0x580c, 0x600c, 0x250c, 0x270c, 0x330c, 0x370c, 0x3f0c, - 0x3b0c, 0x470c, 0x570c, 0x4f0c, 0x5f0c, 0x6f0c, 0x440c, 0x530c, - 0x4c0c, 0x5b0c, 0x630c, 0x410c, 0x540c, 0x490c, 0x5c0c, 0x660c -}; - -static u_short -kanji_convert(u_char mode, u_char h, u_char l) -{ - u_short tmp, high, low, c; - - high = (u_short) h; - low = (u_short) l; - - switch (mode) { - case KTYPE_SJIS: /* SHIFT JIS */ - if (low >= 0xe0) { - low -= 0x40; - } - low = (low - 0x81) * 2 + 0x21; - if (high > 0x7f) { - high--; - } - if (high > 0x9d) { - low++; - high -= 0x9e - 0x21; - } else { - high -= 0x40 - 0x21; - } - high &= 0x7F; - low &= 0x7F; - tmp = ((high << 8) | low) - 0x20; - break; - case KTYPE_7JIS: /* JIS */ - case KTYPE_UJIS: /* UJIS */ - high &= 0x7F; - low &= 0x7F; - tmp = ((high << 8) | low) - 0x20; - break; - default: - tmp = 0; - break; - } - - /* keisen */ - c = ((tmp & 0xff) << 8) | (tmp >> 8); - /* 0x2821 .. 0x2840 */ - if (0x0821 <= c && c <= 0x0840) - tmp = keiConv[c - 0x0821]; - - return (tmp); -} -#endif /* KANJI */ - -static int -scterm_init(scr_stat *scp, void **softc, int code) -{ - term_stat *tcp; - - if (*softc == NULL) { - if (reserved_term_stat.flags & SCTERM_BUSY) - return EINVAL; - *softc = &reserved_term_stat; - } - tcp = *softc; - - switch (code) { - case SC_TE_COLD_INIT: - bzero(tcp, sizeof(*tcp)); - tcp->flags = SCTERM_BUSY; - tcp->esc = 0; - tcp->saved_xpos = -1; - tcp->saved_ypos = -1; -#ifdef KANJI - tcp->kanji_1st_char = 0; - tcp->kanji_type = KTYPE_ASCII; -#endif - tcp->attr_mask = NORMAL_ATTR; - /* XXX */ - tcp->dflt_std_color.fg = SC_NORM_ATTR & 0x0f; - tcp->dflt_std_color.bg = (SC_NORM_ATTR >> 4) & 0x0f; - tcp->dflt_rev_color.fg = SC_NORM_REV_ATTR & 0x0f; - tcp->dflt_rev_color.bg = (SC_NORM_REV_ATTR >> 4) & 0x0f; - tcp->std_color = tcp->dflt_std_color; - tcp->rev_color = tcp->dflt_rev_color; - tcp->cur_color = tcp->std_color; - tcp->cur_attr = mask2attr(tcp); - ++sc_term_sc.te_refcount; - break; - - case SC_TE_WARM_INIT: - tcp->esc = 0; - tcp->saved_xpos = -1; - tcp->saved_ypos = -1; -#if 0 - tcp->std_color = tcp->dflt_std_color; - tcp->rev_color = tcp->dflt_rev_color; -#endif - tcp->cur_color = tcp->std_color; - tcp->cur_attr = mask2attr(tcp); - break; - } - - return 0; -} - -static int -scterm_term(scr_stat *scp, void **softc) -{ - if (*softc == &reserved_term_stat) { - *softc = NULL; - bzero(&reserved_term_stat, sizeof(reserved_term_stat)); - } - --sc_term_sc.te_refcount; - return 0; -} - -static void -scterm_scan_esc(scr_stat *scp, term_stat *tcp, u_char c) -{ - static u_char ansi_col[16] = { - FG_BLACK, FG_RED, FG_GREEN, FG_BROWN, - FG_BLUE, FG_MAGENTA, FG_CYAN, FG_LIGHTGREY, - FG_DARKGREY, FG_LIGHTRED, FG_LIGHTGREEN, FG_YELLOW, - FG_LIGHTBLUE, FG_LIGHTMAGENTA, FG_LIGHTCYAN, FG_WHITE - }; - static int cattrs[] = { - 0, /* block */ - CONS_BLINK_CURSOR, /* blinking block */ - CONS_CHAR_CURSOR, /* underline */ - CONS_CHAR_CURSOR | CONS_BLINK_CURSOR, /* blinking underline */ - CONS_RESET_CURSOR, /* reset to default */ - CONS_HIDDEN_CURSOR, /* hide cursor */ - }; - static int tcattrs[] = { - CONS_RESET_CURSOR | CONS_LOCAL_CURSOR, /* normal */ - CONS_HIDDEN_CURSOR | CONS_LOCAL_CURSOR, /* invisible */ - CONS_BLINK_CURSOR | CONS_LOCAL_CURSOR, /* very visible */ - }; - sc_softc_t *sc; - int v0, v1, v2; - int i, n; - - i = n = 0; - sc = scp->sc; - if (tcp->esc == 1) { /* seen ESC */ -#ifdef KANJI - switch (tcp->kanji_type) { - case KTYPE_KANIN: /* Kanji Invoke sequence */ - switch (c) { - case 'B': - case '@': - tcp->kanji_type = KTYPE_7JIS; - tcp->esc = 0; - tcp->kanji_1st_char = 0; - return; - default: - tcp->kanji_type = KTYPE_ASCII; - tcp->esc = 0; - break; - } - break; - case KTYPE_ASCIN: /* Ascii Invoke sequence */ - switch (c) { - case 'J': - case 'B': - case 'H': - tcp->kanji_type = KTYPE_ASCII; - tcp->esc = 0; - tcp->kanji_1st_char = 0; - return; - case 'I': - tcp->kanji_type = KTYPE_JKANA; - tcp->esc = 0; - tcp->kanji_1st_char = 0; - return; - default: - tcp->kanji_type = KTYPE_ASCII; - tcp->esc = 0; - break; - } - break; - default: - break; - } -#endif - switch (c) { - - case '7': /* Save cursor position */ - tcp->saved_xpos = scp->xpos; - tcp->saved_ypos = scp->ypos; - break; - - case '8': /* Restore saved cursor position */ - if (tcp->saved_xpos >= 0 && tcp->saved_ypos >= 0) - sc_move_cursor(scp, tcp->saved_xpos, - tcp->saved_ypos); - break; - - case '[': /* Start ESC [ sequence */ - tcp->esc = 2; - tcp->last_param = -1; - for (i = tcp->num_param; i < MAX_ESC_PAR; i++) - tcp->param[i] = 1; - tcp->num_param = 0; - return; - -#ifdef KANJI - case '$': /* Kanji Invoke sequence */ - tcp->kanji_type = KTYPE_KANIN; - return; -#endif - - case 'M': /* Move cursor up 1 line, scroll if at top */ - sc_term_up_scroll(scp, 1, sc->scr_map[0x20], - tcp->cur_attr, 0, 0); - break; -#ifdef notyet - case 'Q': - tcp->esc = 4; - return; -#endif - case 'c': /* reset */ - tcp->attr_mask = NORMAL_ATTR; - tcp->cur_color = tcp->std_color - = tcp->dflt_std_color; - tcp->rev_color = tcp->dflt_rev_color; - tcp->cur_attr = mask2attr(tcp); - sc_change_cursor_shape(scp, - CONS_RESET_CURSOR | CONS_LOCAL_CURSOR, -1, -1); - sc_clear_screen(scp); - break; - - case '(': /* iso-2022: designate 94 character set to G0 */ -#ifdef KANJI - tcp->kanji_type = KTYPE_ASCIN; -#else - tcp->esc = 5; -#endif - return; - } - } else if (tcp->esc == 2) { /* seen ESC [ */ - if (c >= '0' && c <= '9') { - if (tcp->num_param < MAX_ESC_PAR) { - if (tcp->last_param != tcp->num_param) { - tcp->last_param = tcp->num_param; - tcp->param[tcp->num_param] = 0; - } else { - tcp->param[tcp->num_param] *= 10; - } - tcp->param[tcp->num_param] += c - '0'; - return; - } - } - tcp->num_param = tcp->last_param + 1; - switch (c) { - - case ';': - if (tcp->num_param < MAX_ESC_PAR) - return; - break; - - case '=': - tcp->esc = 3; - tcp->last_param = -1; - for (i = tcp->num_param; i < MAX_ESC_PAR; i++) - tcp->param[i] = 1; - tcp->num_param = 0; - return; - - case 'A': /* up n rows */ - sc_term_up(scp, tcp->param[0], 0); - break; - - case 'B': /* down n rows */ - sc_term_down(scp, tcp->param[0], 0); - break; - - case 'C': /* right n columns */ - sc_term_right(scp, tcp->param[0]); - break; - - case 'D': /* left n columns */ - sc_term_left(scp, tcp->param[0]); - break; - - case 'E': /* cursor to start of line n lines down */ - n = tcp->param[0]; - if (n < 1) - n = 1; - sc_move_cursor(scp, 0, scp->ypos + n); - break; - - case 'F': /* cursor to start of line n lines up */ - n = tcp->param[0]; - if (n < 1) - n = 1; - sc_move_cursor(scp, 0, scp->ypos - n); - break; - - case 'f': /* Cursor move */ - case 'H': - if (tcp->num_param == 0) - sc_move_cursor(scp, 0, 0); - else if (tcp->num_param == 2) - sc_move_cursor(scp, tcp->param[1] - 1, - tcp->param[0] - 1); - break; - - case 'J': /* Clear all or part of display */ - if (tcp->num_param == 0) - n = 0; - else - n = tcp->param[0]; - sc_term_clr_eos(scp, n, sc->scr_map[0x20], - tcp->cur_attr); - break; - - case 'K': /* Clear all or part of line */ - if (tcp->num_param == 0) - n = 0; - else - n = tcp->param[0]; - sc_term_clr_eol(scp, n, sc->scr_map[0x20], - tcp->cur_attr); - break; - - case 'L': /* Insert n lines */ - sc_term_ins_line(scp, scp->ypos, tcp->param[0], - sc->scr_map[0x20], tcp->cur_attr, 0); - break; - - case 'M': /* Delete n lines */ - sc_term_del_line(scp, scp->ypos, tcp->param[0], - sc->scr_map[0x20], tcp->cur_attr, 0); - break; - - case 'P': /* Delete n chars */ - sc_term_del_char(scp, tcp->param[0], - sc->scr_map[0x20], tcp->cur_attr); - break; - - case '@': /* Insert n chars */ - sc_term_ins_char(scp, tcp->param[0], - sc->scr_map[0x20], tcp->cur_attr); - break; - - case 'S': /* scroll up n lines */ - sc_term_del_line(scp, 0, tcp->param[0], - sc->scr_map[0x20], tcp->cur_attr, 0); - break; - - case 'T': /* scroll down n lines */ - sc_term_ins_line(scp, 0, tcp->param[0], - sc->scr_map[0x20], tcp->cur_attr, 0); - break; - - case 'X': /* erase n characters in line */ - n = tcp->param[0]; - if (n < 1) - n = 1; - if (n > scp->xsize - scp->xpos) - n = scp->xsize - scp->xpos; - sc_vtb_erase(&scp->vtb, scp->cursor_pos, n, - sc->scr_map[0x20], tcp->cur_attr); - mark_for_update(scp, scp->cursor_pos); - mark_for_update(scp, scp->cursor_pos + n - 1); - break; - - case 'Z': /* move n tabs backwards */ - sc_term_backtab(scp, tcp->param[0]); - break; - - case '`': /* move cursor to column n */ - sc_term_col(scp, tcp->param[0]); - break; - - case 'a': /* move cursor n columns to the right */ - sc_term_right(scp, tcp->param[0]); - break; - - case 'd': /* move cursor to row n */ - sc_term_row(scp, tcp->param[0]); - break; - - case 'e': /* move cursor n rows down */ - sc_term_down(scp, tcp->param[0], 0); - break; - - case 'm': /* change attribute */ - if (tcp->num_param == 0) { - tcp->attr_mask = NORMAL_ATTR; - tcp->cur_color = tcp->std_color; - tcp->cur_attr = mask2attr(tcp); - break; - } - for (i = 0; i < tcp->num_param; i++) { - switch (n = tcp->param[i]) { - case 0: /* back to normal */ - tcp->attr_mask = NORMAL_ATTR; - tcp->cur_color = tcp->std_color; - tcp->cur_attr = mask2attr(tcp); - break; - case 1: /* bold */ - tcp->attr_mask |= BOLD_ATTR; - tcp->cur_attr = mask2attr(tcp); - break; - case 4: /* underline */ - tcp->attr_mask |= UNDERLINE_ATTR; - tcp->cur_attr = mask2attr(tcp); - break; - case 5: /* blink */ - tcp->attr_mask |= BLINK_ATTR; - tcp->cur_attr = mask2attr(tcp); - break; - case 7: /* reverse */ - tcp->attr_mask |= REVERSE_ATTR; - tcp->cur_attr = mask2attr(tcp); - break; - case 22: /* remove bold (or dim) */ - tcp->attr_mask &= ~BOLD_ATTR; - tcp->cur_attr = mask2attr(tcp); - break; - case 24: /* remove underline */ - tcp->attr_mask &= ~UNDERLINE_ATTR; - tcp->cur_attr = mask2attr(tcp); - break; - case 25: /* remove blink */ - tcp->attr_mask &= ~BLINK_ATTR; - tcp->cur_attr = mask2attr(tcp); - break; - case 27: /* remove reverse */ - tcp->attr_mask &= ~REVERSE_ATTR; - tcp->cur_attr = mask2attr(tcp); - break; - case 30: case 31: /* set ansi fg color */ - case 32: case 33: case 34: - case 35: case 36: case 37: - tcp->attr_mask |= FG_CHANGED; - tcp->cur_color.fg = ansi_col[n - 30]; - tcp->cur_attr = mask2attr(tcp); - break; - case 39: /* restore fg color back to normal */ - tcp->attr_mask &= ~(FG_CHANGED|BOLD_ATTR); - tcp->cur_color.fg = tcp->std_color.fg; - tcp->cur_attr = mask2attr(tcp); - break; - case 40: case 41: /* set ansi bg color */ - case 42: case 43: case 44: - case 45: case 46: case 47: - tcp->attr_mask |= BG_CHANGED; - tcp->cur_color.bg = ansi_col[n - 40]; - tcp->cur_attr = mask2attr(tcp); - break; - case 49: /* restore bg color back to normal */ - tcp->attr_mask &= ~BG_CHANGED; - tcp->cur_color.bg = tcp->std_color.bg; - tcp->cur_attr = mask2attr(tcp); - break; - } - } - break; - - case 's': /* Save cursor position */ - tcp->saved_xpos = scp->xpos; - tcp->saved_ypos = scp->ypos; - break; - - case 'u': /* Restore saved cursor position */ - if (tcp->saved_xpos >= 0 && tcp->saved_ypos >= 0) - sc_move_cursor(scp, tcp->saved_xpos, - tcp->saved_ypos); - break; - - case 'x': - if (tcp->num_param == 0) - n = 0; - else - n = tcp->param[0]; - switch (n) { - case 0: /* reset colors and attributes back to normal */ - tcp->attr_mask = NORMAL_ATTR; - tcp->cur_color = tcp->std_color - = tcp->dflt_std_color; - tcp->rev_color = tcp->dflt_rev_color; - tcp->cur_attr = mask2attr(tcp); - break; - case 1: /* set ansi background */ - tcp->attr_mask &= ~BG_CHANGED; - tcp->cur_color.bg = tcp->std_color.bg - = ansi_col[tcp->param[1] & 0x0f]; - tcp->cur_attr = mask2attr(tcp); - break; - case 2: /* set ansi foreground */ - tcp->attr_mask &= ~FG_CHANGED; - tcp->cur_color.fg = tcp->std_color.fg - = ansi_col[tcp->param[1] & 0x0f]; - tcp->cur_attr = mask2attr(tcp); - break; - case 3: /* set adapter attribute directly */ - tcp->attr_mask &= ~(FG_CHANGED | BG_CHANGED); - tcp->cur_color.fg = tcp->std_color.fg - = tcp->param[1] & 0x0f; - tcp->cur_color.bg = tcp->std_color.bg - = (tcp->param[1] >> 4) & 0x0f; - tcp->cur_attr = mask2attr(tcp); - break; - case 5: /* set ansi reverse background */ - tcp->rev_color.bg = ansi_col[tcp->param[1] & 0x0f]; - tcp->cur_attr = mask2attr(tcp); - break; - case 6: /* set ansi reverse foreground */ - tcp->rev_color.fg = ansi_col[tcp->param[1] & 0x0f]; - tcp->cur_attr = mask2attr(tcp); - break; - case 7: /* set adapter reverse attribute directly */ - tcp->rev_color.fg = tcp->param[1] & 0x0f; - tcp->rev_color.bg = (tcp->param[1] >> 4) & 0x0f; - tcp->cur_attr = mask2attr(tcp); - break; - } - break; - - case 'z': /* switch to (virtual) console n */ - if (tcp->num_param == 1) - sc_switch_scr(sc, tcp->param[0]); - break; - } - } else if (tcp->esc == 3) { /* seen ESC [0-9]+ = */ - if (c >= '0' && c <= '9') { - if (tcp->num_param < MAX_ESC_PAR) { - if (tcp->last_param != tcp->num_param) { - tcp->last_param = tcp->num_param; - tcp->param[tcp->num_param] = 0; - } else { - tcp->param[tcp->num_param] *= 10; - } - tcp->param[tcp->num_param] += c - '0'; - return; - } - } - tcp->num_param = tcp->last_param + 1; - switch (c) { - - case ';': - if (tcp->num_param < MAX_ESC_PAR) - return; - break; - - case 'A': /* set display border color */ - if (tcp->num_param == 1) { - scp->border=tcp->param[0] & 0xff; - if (scp == sc->cur_scp) - sc_set_border(scp, scp->border); - } - break; - - case 'B': /* set bell pitch and duration */ - if (tcp->num_param == 2) { - scp->bell_pitch = tcp->param[0]; - scp->bell_duration = - (tcp->param[1] * hz + 99) / 100; - } - break; - - case 'C': /* set global/parmanent cursor type & shape */ - i = spltty(); - n = tcp->num_param; - v0 = tcp->param[0]; - v1 = tcp->param[1]; - v2 = tcp->param[2]; - switch (n) { - case 1: /* flags only */ - if (v0 < nitems(cattrs)) - v0 = cattrs[v0]; - else /* backward compatibility */ - v0 = cattrs[v0 & 0x3]; - sc_change_cursor_shape(scp, v0, -1, -1); - break; - case 2: - v2 = 0; - v0 &= 0x1f; /* backward compatibility */ - v1 &= 0x1f; - /* FALL THROUGH */ - case 3: /* base and height */ - if (v2 == 0) /* count from top */ - sc_change_cursor_shape(scp, -1, - scp->font_size - v1 - 1, - v1 - v0 + 1); - else if (v2 == 1) /* count from bottom */ - sc_change_cursor_shape(scp, -1, - v0, v1 - v0 + 1); - break; - } - splx(i); - break; - - case 'F': /* set adapter foreground */ - if (tcp->num_param == 1) { - tcp->attr_mask &= ~FG_CHANGED; - tcp->cur_color.fg = tcp->std_color.fg - = tcp->param[0] & 0x0f; - tcp->cur_attr = mask2attr(tcp); - } - break; - - case 'G': /* set adapter background */ - if (tcp->num_param == 1) { - tcp->attr_mask &= ~BG_CHANGED; - tcp->cur_color.bg = tcp->std_color.bg - = tcp->param[0] & 0x0f; - tcp->cur_attr = mask2attr(tcp); - } - break; - - case 'H': /* set adapter reverse foreground */ - if (tcp->num_param == 1) { - tcp->rev_color.fg = tcp->param[0] & 0x0f; - tcp->cur_attr = mask2attr(tcp); - } - break; - - case 'I': /* set adapter reverse background */ - if (tcp->num_param == 1) { - tcp->rev_color.bg = tcp->param[0] & 0x0f; - tcp->cur_attr = mask2attr(tcp); - } - break; - - case 'S': /* set local/temporary cursor type & shape */ - i = spltty(); - n = tcp->num_param; - v0 = tcp->param[0]; - switch (n) { - case 0: - v0 = 0; - /* FALL THROUGH */ - case 1: - if (v0 < nitems(tcattrs)) - sc_change_cursor_shape(scp, - tcattrs[v0], -1, -1); - break; - } - splx(i); - break; - } -#ifdef notyet - } else if (tcp->esc == 4) { /* seen ESC Q */ - /* to be filled */ -#endif - } else if (tcp->esc == 5) { /* seen ESC ( */ - switch (c) { - case 'B': /* iso-2022: desginate ASCII into G0 */ - break; - /* other items to be filled */ - default: - break; - } - } - tcp->esc = 0; -} - -static void -scterm_puts(scr_stat *scp, u_char *buf, int len, int kernel) -{ - term_stat *tcp; - u_char *ptr; -#ifdef KANJI - u_short kanji_code; -#endif - color_t backup; - - tcp = scp->ts; - ptr = buf; -outloop: - scp->sc->write_in_progress++; - backup = tcp->cur_color; - if (kernel) { - tcp->cur_color.fg = SC_KERNEL_CONS_ATTR & 0x0f; - tcp->cur_color.bg = (SC_KERNEL_CONS_ATTR >> 4) & 0x0f; - } - - if (tcp->esc) { - scterm_scan_esc(scp, tcp, *ptr++); - len--; - } else if (PRINTABLE(*ptr)) { /* Print only printables */ - vm_offset_t p; - u_char *map; - int attr; - int i; - int cnt; -#ifdef KANJI - u_char c; -#endif - - p = sc_vtb_pointer(&scp->vtb, scp->cursor_pos); - map = scp->sc->scr_map; - attr = tcp->cur_attr; - -#ifdef KANJI - c = *ptr; - if (tcp->kanji_1st_char == 0) { - tcp->kanji_type = iskanji1(tcp->kanji_type, c); - if (!IS_KTYPE_ASCII_or_HANKAKU(tcp->kanji_type)) { - /* not Ascii & not HANKAKU */ - tcp->kanji_1st_char = c; - goto kanji_end; - } else if (tcp->kanji_type == KTYPE_ASCII) { - cnt = imin(len, scp->xsize - scp->xpos); - i = cnt; - do { - p = sc_vtb_putchar(&scp->vtb, p, map[c], attr); - c = *++ptr; - --i; - } while (i > 0 && PRINTABLE(c) && - iskanji1(tcp->kanji_type, c) == KTYPE_ASCII); - - len -= cnt - i; - mark_for_update(scp, scp->cursor_pos); - scp->cursor_pos += cnt - i; - mark_for_update(scp, scp->cursor_pos - 1); - scp->xpos += cnt - i; - KTYPE_MASK_CTRL(tcp->kanji_type); - goto ascii_end; - } - } else { - if ((tcp->kanji_type = - iskanji2(tcp->kanji_type, c)) & 0xee) { - /* print kanji on TEXT VRAM */ - kanji_code = kanji_convert(tcp->kanji_type, c, - tcp->kanji_1st_char); - mark_for_update(scp, scp->cursor_pos); - for (i = 0; i < 2; i++) { - /* *cursor_pos = (kanji_code | (i*0x80)); */ - p = sc_vtb_putchar(&scp->vtb, p, - kanji_code | ((i == 0) ? 0x00 : 0x80), attr); - ++scp->cursor_pos; - if (++scp->xpos >= scp->xsize) { - scp->xpos = 0; - scp->ypos++; - } - } - mark_for_update(scp, scp->cursor_pos - 1); - KTYPE_MASK_CTRL(tcp->kanji_type); - tcp->kanji_1st_char = 0; - goto kanji_end; - } else { - tcp->kanji_1st_char = 0; - } - } - if (IS_KTYPE_KANA(tcp->kanji_type)) - c |= 0x80; - KTYPE_MASK_CTRL(tcp->kanji_type); - sc_vtb_putchar(&scp->vtb, p, map[c], attr); - mark_for_update(scp, scp->cursor_pos); - mark_for_update(scp, scp->cursor_pos); - ++scp->cursor_pos; - ++scp->xpos; -kanji_end: - ++ptr; - --len; -ascii_end: -#else /* !KANJI */ - cnt = imin(len, scp->xsize - scp->xpos); - i = cnt; - do { - /* - * gcc-2.6.3 generates poor (un)sign extension code. - * Casting the pointers in the following to volatile should - * have no effect, but in fact speeds up this inner loop - * from 26 to 18 cycles (+ cache misses) on i486's. - */ -#define UCVP(ucp) ((u_char volatile *)(ucp)) - p = sc_vtb_putchar(&scp->vtb, p, UCVP(map)[*UCVP(ptr)], - attr); - ++ptr; - --i; - } while (i > 0 && PRINTABLE(*ptr)); - - len -= cnt - i; - mark_for_update(scp, scp->cursor_pos); - scp->cursor_pos += cnt - i; - mark_for_update(scp, scp->cursor_pos - 1); - scp->xpos += cnt - i; -#endif /* !KANJI */ - - if (scp->xpos >= scp->xsize) { - scp->xpos = 0; - scp->ypos++; - } - } else { - switch (*ptr) { - case 0x07: - sc_bell(scp, scp->bell_pitch, scp->bell_duration); - break; - - case 0x08: /* non-destructive backspace */ - if (scp->cursor_pos > 0) { - mark_for_update(scp, scp->cursor_pos); - scp->cursor_pos--; - mark_for_update(scp, scp->cursor_pos); - if (scp->xpos > 0) - scp->xpos--; - else { - scp->xpos += scp->xsize - 1; - scp->ypos--; - } - } - break; - - case 0x09: /* non-destructive tab */ - mark_for_update(scp, scp->cursor_pos); - scp->cursor_pos += (8 - scp->xpos % 8u); - scp->xpos += (8 - scp->xpos % 8u); - if (scp->xpos >= scp->xsize) { - scp->xpos = 0; - scp->ypos++; - scp->cursor_pos = scp->xsize * scp->ypos; - } - mark_for_update(scp, scp->cursor_pos); - break; - - case 0x0a: /* newline, same pos */ - mark_for_update(scp, scp->cursor_pos); - scp->cursor_pos += scp->xsize; - mark_for_update(scp, scp->cursor_pos); - scp->ypos++; - break; - - case 0x0c: /* form feed, clears screen */ - sc_clear_screen(scp); - break; - - case 0x0d: /* return, return to pos 0 */ - mark_for_update(scp, scp->cursor_pos); - scp->cursor_pos -= scp->xpos; - mark_for_update(scp, scp->cursor_pos); - scp->xpos = 0; - break; - - case 0x0e: /* ^N */ - tcp->kanji_type = KTYPE_JKANA; - tcp->esc = 0; - tcp->kanji_1st_char = 0; - break; - - case 0x0f: /* ^O */ - tcp->kanji_type = KTYPE_ASCII; - tcp->esc = 0; - tcp->kanji_1st_char = 0; - break; - - case 0x1b: /* start escape sequence */ - tcp->esc = 1; - tcp->num_param = 0; - break; - } - ptr++; - len--; - } - - sc_term_gen_scroll(scp, scp->sc->scr_map[0x20], tcp->cur_attr); - - if (kernel) - tcp->cur_color = backup; - scp->sc->write_in_progress--; - if (len) - goto outloop; -} - -static int -scterm_ioctl(scr_stat *scp, struct tty *tp, u_long cmd, caddr_t data, - struct thread *td) -{ - term_stat *tcp = scp->ts; - vid_info_t *vi; - - switch (cmd) { - case GIO_ATTR: /* get current attributes */ - /* FIXME: */ - *(int*)data = (tcp->cur_attr >> 8) & 0xff; - return 0; - case CONS_GETINFO: /* get current (virtual) console info */ - vi = (vid_info_t *)data; - if (vi->size != sizeof(struct vid_info)) - return EINVAL; - vi->mv_norm.fore = tcp->std_color.fg; - vi->mv_norm.back = tcp->std_color.bg; - vi->mv_rev.fore = tcp->rev_color.fg; - vi->mv_rev.back = tcp->rev_color.bg; - /* - * The other fields are filled by the upper routine. XXX - */ - return ENOIOCTL; - } - return ENOIOCTL; -} - -static int -scterm_reset(scr_stat *scp, int code) -{ - /* FIXME */ - return 0; -} - -static void -scterm_default_attr(scr_stat *scp, int color, int rev_color) -{ - term_stat *tcp = scp->ts; - - tcp->dflt_std_color.fg = color & 0x0f; - tcp->dflt_std_color.bg = (color >> 4) & 0x0f; - tcp->dflt_rev_color.fg = rev_color & 0x0f; - tcp->dflt_rev_color.bg = (rev_color >> 4) & 0x0f; - tcp->std_color = tcp->dflt_std_color; - tcp->rev_color = tcp->dflt_rev_color; - tcp->cur_color = tcp->std_color; - tcp->cur_attr = mask2attr(tcp); -} - -static void -scterm_clear(scr_stat *scp) -{ - term_stat *tcp = scp->ts; - - sc_move_cursor(scp, 0, 0); - sc_vtb_clear(&scp->vtb, scp->sc->scr_map[0x20], tcp->cur_attr); - mark_all(scp); -} - -static void -scterm_notify(scr_stat *scp, int event) -{ - switch (event) { - case SC_TE_NOTIFY_VTSWITCH_IN: - break; - case SC_TE_NOTIFY_VTSWITCH_OUT: - break; - } -} - -static int -scterm_input(scr_stat *scp, int c, struct tty *tp) -{ - return FALSE; -} - -static const char * -scterm_fkeystr(scr_stat *scp, int c) -{ - - return (NULL); -} - -/* - * Calculate hardware attributes word using logical attributes mask and - * hardware colors - */ - -/* FIXME */ -static int -mask2attr(term_stat *tcp) -{ - int attr, mask = tcp->attr_mask; - - if (mask & REVERSE_ATTR) { - attr = ((mask & FG_CHANGED) ? - tcp->cur_color.bg : tcp->rev_color.fg) | - (((mask & BG_CHANGED) ? - tcp->cur_color.fg : tcp->rev_color.bg) << 4); - } else - attr = tcp->cur_color.fg | (tcp->cur_color.bg << 4); - - /* XXX: underline mapping for Hercules adapter can be better */ - if (mask & (BOLD_ATTR | UNDERLINE_ATTR)) - attr ^= 0x08; - if (mask & BLINK_ATTR) - attr ^= 0x80; - - return (attr << 8); -} diff --git a/sys/pc98/cbus/sctermvar.h b/sys/pc98/cbus/sctermvar.h deleted file mode 100644 index b1c01af1f800..000000000000 --- a/sys/pc98/cbus/sctermvar.h +++ /dev/null @@ -1,432 +0,0 @@ -/*- - * Copyright (c) 1999 Kazutaka YOKOTA <yokota@zodiac.mech.utsunomiya-u.ac.jp> - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer as - * the first lines of this file unmodified. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD$ - */ - -#ifndef _DEV_SYSCONS_SCTERMVAR_H_ -#define _DEV_SYSCONS_SCTERMVAR_H_ - -/* - * building blocks for terminal emulator modules. - */ - -static __inline void sc_term_ins_line(scr_stat *scp, int y, int n, int ch, - int attr, int tail); -static __inline void sc_term_del_line(scr_stat *scp, int y, int n, int ch, - int attr, int tail); -static __inline void sc_term_ins_char(scr_stat *scp, int n, int ch, - int attr); -static __inline void sc_term_del_char(scr_stat *scp, int n, int ch, - int attr); -static __inline void sc_term_col(scr_stat *scp, int n); -static __inline void sc_term_row(scr_stat *scp, int n); -static __inline void sc_term_up(scr_stat *scp, int n, int head); -static __inline void sc_term_down(scr_stat *scp, int n, int tail); -static __inline void sc_term_left(scr_stat *scp, int n); -static __inline void sc_term_right(scr_stat *scp, int n); -static __inline void sc_term_up_scroll(scr_stat *scp, int n, int ch, - int attr, int head, int tail); -static __inline void sc_term_down_scroll(scr_stat *scp, int n, int ch, - int attr, int head, int tail); -static __inline void sc_term_clr_eos(scr_stat *scp, int n, int ch, int attr); -static __inline void sc_term_clr_eol(scr_stat *scp, int n, int ch, int attr); -static __inline void sc_term_tab(scr_stat *scp, int n); -static __inline void sc_term_backtab(scr_stat *scp, int n); -static __inline void sc_term_respond(scr_stat *scp, u_char *s); -static __inline void sc_term_gen_print(scr_stat *scp, u_char **buf, int *len, - int attr); -static __inline void sc_term_gen_scroll(scr_stat *scp, int ch, int attr); - -static __inline void -sc_term_ins_line(scr_stat *scp, int y, int n, int ch, int attr, int tail) -{ - if (tail <= 0) - tail = scp->ysize; - if (n < 1) - n = 1; - if (n > tail - y) - n = tail - y; - sc_vtb_ins(&scp->vtb, y*scp->xsize, n*scp->xsize, ch, attr); - mark_for_update(scp, y*scp->xsize); - mark_for_update(scp, scp->xsize*tail - 1); -} - -static __inline void -sc_term_del_line(scr_stat *scp, int y, int n, int ch, int attr, int tail) -{ - if (tail <= 0) - tail = scp->ysize; - if (n < 1) - n = 1; - if (n > tail - y) - n = tail - y; - sc_vtb_delete(&scp->vtb, y*scp->xsize, n*scp->xsize, ch, attr); - mark_for_update(scp, y*scp->xsize); - mark_for_update(scp, scp->xsize*tail - 1); -} - -static __inline void -sc_term_ins_char(scr_stat *scp, int n, int ch, int attr) -{ - int count; - - if (n < 1) - n = 1; - if (n > scp->xsize - scp->xpos) - n = scp->xsize - scp->xpos; - count = scp->xsize - (scp->xpos + n); - sc_vtb_move(&scp->vtb, scp->cursor_pos, scp->cursor_pos + n, count); - sc_vtb_erase(&scp->vtb, scp->cursor_pos, n, ch, attr); - mark_for_update(scp, scp->cursor_pos); - mark_for_update(scp, scp->cursor_pos + n + count - 1); -} - -static __inline void -sc_term_del_char(scr_stat *scp, int n, int ch, int attr) -{ - int count; - - if (n < 1) - n = 1; - if (n > scp->xsize - scp->xpos) - n = scp->xsize - scp->xpos; - count = scp->xsize - (scp->xpos + n); - sc_vtb_move(&scp->vtb, scp->cursor_pos + n, scp->cursor_pos, count); - sc_vtb_erase(&scp->vtb, scp->cursor_pos + count, n, ch, attr); - mark_for_update(scp, scp->cursor_pos); - mark_for_update(scp, scp->cursor_pos + n + count - 1); -} - -static __inline void -sc_term_col(scr_stat *scp, int n) -{ - if (n < 1) - n = 1; - sc_move_cursor(scp, n - 1, scp->ypos); -} - -static __inline void -sc_term_row(scr_stat *scp, int n) -{ - if (n < 1) - n = 1; - sc_move_cursor(scp, scp->xpos, n - 1); -} - -static __inline void -sc_term_up(scr_stat *scp, int n, int head) -{ - if (n < 1) - n = 1; - n = imin(n, scp->ypos - head); - if (n <= 0) - return; - sc_move_cursor(scp, scp->xpos, scp->ypos - n); -} - -static __inline void -sc_term_down(scr_stat *scp, int n, int tail) -{ - if (tail <= 0) - tail = scp->ysize; - if (n < 1) - n = 1; - n = imin(n, tail - scp->ypos - 1); - if (n <= 0) - return; - sc_move_cursor(scp, scp->xpos, scp->ypos + n); -} - -static __inline void -sc_term_left(scr_stat *scp, int n) -{ - if (n < 1) - n = 1; - sc_move_cursor(scp, scp->xpos - n, scp->ypos); -} - -static __inline void -sc_term_right(scr_stat *scp, int n) -{ - if (n < 1) - n = 1; - sc_move_cursor(scp, scp->xpos + n, scp->ypos); -} - -static __inline void -sc_term_up_scroll(scr_stat *scp, int n, int ch, int attr, int head, int tail) -{ - if (tail <= 0) - tail = scp->ysize; - if (n < 1) - n = 1; - if (n <= scp->ypos - head) { - sc_move_cursor(scp, scp->xpos, scp->ypos - n); - } else { - sc_term_ins_line(scp, head, n - (scp->ypos - head), - ch, attr, tail); - sc_move_cursor(scp, scp->xpos, head); - } -} - -static __inline void -sc_term_down_scroll(scr_stat *scp, int n, int ch, int attr, int head, int tail) -{ - if (tail <= 0) - tail = scp->ysize; - if (n < 1) - n = 1; - if (n < tail - scp->ypos) { - sc_move_cursor(scp, scp->xpos, scp->ypos + n); - } else { - sc_term_del_line(scp, head, n - (tail - scp->ypos) + 1, - ch, attr, tail); - sc_move_cursor(scp, scp->xpos, tail - 1); - } -} - -static __inline void -sc_term_clr_eos(scr_stat *scp, int n, int ch, int attr) -{ - switch (n) { - case 0: /* clear form cursor to end of display */ - sc_vtb_erase(&scp->vtb, scp->cursor_pos, - scp->xsize*scp->ysize - scp->cursor_pos, - ch, attr); - mark_for_update(scp, scp->cursor_pos); - mark_for_update(scp, scp->xsize*scp->ysize - 1); - sc_remove_cutmarking(scp); - break; - case 1: /* clear from beginning of display to cursor */ - sc_vtb_erase(&scp->vtb, 0, scp->cursor_pos + 1, ch, attr); - mark_for_update(scp, 0); - mark_for_update(scp, scp->cursor_pos); - sc_remove_cutmarking(scp); - break; - case 2: /* clear entire display */ - sc_vtb_erase(&scp->vtb, 0, scp->xsize*scp->ysize, ch, attr); - mark_for_update(scp, 0); - mark_for_update(scp, scp->xsize*scp->ysize - 1); - sc_remove_cutmarking(scp); - break; - } -} - -static __inline void -sc_term_clr_eol(scr_stat *scp, int n, int ch, int attr) -{ - switch (n) { - case 0: /* clear form cursor to end of line */ - sc_vtb_erase(&scp->vtb, scp->cursor_pos, - scp->xsize - scp->xpos, ch, attr); - mark_for_update(scp, scp->cursor_pos); - mark_for_update(scp, scp->cursor_pos + - scp->xsize - 1 - scp->xpos); - break; - case 1: /* clear from beginning of line to cursor */ - sc_vtb_erase(&scp->vtb, scp->cursor_pos - scp->xpos, - scp->xpos + 1, ch, attr); - mark_for_update(scp, scp->ypos*scp->xsize); - mark_for_update(scp, scp->cursor_pos); - break; - case 2: /* clear entire line */ - sc_vtb_erase(&scp->vtb, scp->cursor_pos - scp->xpos, - scp->xsize, ch, attr); - mark_for_update(scp, scp->ypos*scp->xsize); - mark_for_update(scp, (scp->ypos + 1)*scp->xsize - 1); - break; - } -} - -static __inline void -sc_term_tab(scr_stat *scp, int n) -{ - int i; - - if (n < 1) - n = 1; - i = (scp->xpos & ~7) + 8*n; - if (i >= scp->xsize) { - if (scp->ypos >= scp->ysize - 1) { - scp->xpos = 0; - scp->ypos++; - scp->cursor_pos = scp->ypos*scp->xsize; - } else - sc_move_cursor(scp, 0, scp->ypos + 1); - } else - sc_move_cursor(scp, i, scp->ypos); -} - -static __inline void -sc_term_backtab(scr_stat *scp, int n) -{ - int i; - - if (n < 1) - n = 1; - if ((i = scp->xpos & ~7) == scp->xpos) - i -= 8*n; - else - i -= 8*(n - 1); - if (i < 0) - i = 0; - sc_move_cursor(scp, i, scp->ypos); -} - -static __inline void -sc_term_respond(scr_stat *scp, u_char *s) -{ - sc_paste(scp, s, strlen(s)); /* XXX: not correct, don't use rmap */ -} - -static __inline void -sc_term_gen_print(scr_stat *scp, u_char **buf, int *len, int attr) -{ - vm_offset_t p; - u_char *ptr; - u_char *map; - int cnt; - int l; - int i; - - ptr = *buf; - l = *len; - - if (PRINTABLE(*ptr)) { - p = sc_vtb_pointer(&scp->vtb, scp->cursor_pos); - map = scp->sc->scr_map; - - cnt = imin(l, scp->xsize - scp->xpos); - i = cnt; - do { - p = sc_vtb_putchar(&scp->vtb, p, map[*ptr], attr); - ++ptr; - --i; - } while ((i > 0) && PRINTABLE(*ptr)); - - l -= cnt - i; - mark_for_update(scp, scp->cursor_pos); - scp->cursor_pos += cnt - i; - mark_for_update(scp, scp->cursor_pos - 1); - scp->xpos += cnt - i; - - if (scp->xpos >= scp->xsize) { - scp->xpos = 0; - scp->ypos++; - /* we may have to scroll the screen */ - } - } else { - switch(*ptr) { - case 0x07: - sc_bell(scp, scp->bell_pitch, scp->bell_duration); - break; - - case 0x08: /* non-destructive backspace */ - /* XXX */ - if (scp->cursor_pos > 0) { -#if 0 - mark_for_update(scp, scp->cursor_pos); - scp->cursor_pos--; - mark_for_update(scp, scp->cursor_pos); -#else - scp->cursor_pos--; -#endif - if (scp->xpos > 0) { - scp->xpos--; - } else { - scp->xpos += scp->xsize - 1; - scp->ypos--; - } - } - break; - - case 0x09: /* non-destructive tab */ - sc_term_tab(scp, 1); - /* we may have to scroll the screen */ -#if 0 - mark_for_update(scp, scp->cursor_pos); - scp->cursor_pos += (8 - scp->xpos % 8u); - mark_for_update(scp, scp->cursor_pos); - scp->xpos += (8 - scp->xpos % 8u); - if (scp->xpos >= scp->xsize) { - scp->xpos = 0; - scp->ypos++; - } -#endif - break; - - case 0x0a: /* newline, same pos */ -#if 0 - mark_for_update(scp, scp->cursor_pos); - scp->cursor_pos += scp->xsize; - mark_for_update(scp, scp->cursor_pos); -#else - scp->cursor_pos += scp->xsize; - /* we may have to scroll the screen */ -#endif - scp->ypos++; - break; - - case 0x0c: /* form feed, clears screen */ - sc_clear_screen(scp); - break; - - case 0x0d: /* return, return to pos 0 */ -#if 0 - mark_for_update(scp, scp->cursor_pos); - scp->cursor_pos -= scp->xpos; - mark_for_update(scp, scp->cursor_pos); -#else - scp->cursor_pos -= scp->xpos; -#endif - scp->xpos = 0; - break; - } - ptr++; l--; - } - - *buf = ptr; - *len = l; -} - -static __inline void -sc_term_gen_scroll(scr_stat *scp, int ch, int attr) -{ - /* do we have to scroll ?? */ - if (scp->cursor_pos >= scp->ysize*scp->xsize) { - sc_remove_cutmarking(scp); /* XXX */ -#ifndef SC_NO_HISTORY - if (scp->history != NULL) - sc_hist_save_one_line(scp, 0); /* XXX */ -#endif - sc_vtb_delete(&scp->vtb, 0, scp->xsize, ch, attr); - scp->cursor_pos -= scp->xsize; - scp->ypos--; - mark_all(scp); - } -} - -#endif /* _DEV_SYSCONS_SCTERMVAR_H_ */ diff --git a/sys/pc98/cbus/scvtb.c b/sys/pc98/cbus/scvtb.c deleted file mode 100644 index c25ef14938f9..000000000000 --- a/sys/pc98/cbus/scvtb.c +++ /dev/null @@ -1,399 +0,0 @@ -/*- - * Copyright (c) 1999 FreeBSD(98) Porting Team. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer as - * the first lines of this file unmodified. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD$ - */ - -#include "opt_syscons.h" - -#include <sys/param.h> -#include <sys/systm.h> -#include <sys/malloc.h> -#include <sys/consio.h> -#include <sys/fbio.h> - -#include <machine/md_var.h> - -#include <dev/fb/fbreg.h> -#include <dev/syscons/syscons.h> - -#define ATTR_OFFSET_FB 0x2000 -#define attr_offset(vtb) ((vtb)->vtb_size*sizeof(u_int16_t)) - -#define vtb_pointer(vtb, at) \ - ((vtb)->vtb_buffer + sizeof(u_int16_t)*(at)) - -#define vtb_wrap(vtb, at, offset) \ - (((at) + (offset) + (vtb)->vtb_size)%(vtb)->vtb_size) - -static u_int8_t ibmpc_to_pc98[256] = { - 0x01, 0x21, 0x81, 0xa1, 0x41, 0x61, 0xc1, 0xe1, - 0x09, 0x29, 0x89, 0xa9, 0x49, 0x69, 0xc9, 0xe9, - 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, - 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, - 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, - 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, - 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, - 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, - 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, - 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, - 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, - 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, - 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, - 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, - 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, - 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, - - 0x03, 0x23, 0x83, 0xa3, 0x43, 0x63, 0xc3, 0xe3, - 0x0b, 0x2b, 0x8b, 0xab, 0x4b, 0x6b, 0xcb, 0xeb, - 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, - 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, - 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, - 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, - 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, - 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, - 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, - 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, - 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, - 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, - 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, - 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, - 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, - 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, -}; -#define at2pc98(attr) ((attr) | ibmpc_to_pc98[(unsigned)(attr) >> 8]) - -void -sc_vtb_init(sc_vtb_t *vtb, int type, int cols, int rows, void *buf, int wait) -{ - vtb->vtb_flags = 0; - vtb->vtb_type = type; - vtb->vtb_cols = cols; - vtb->vtb_rows = rows; - vtb->vtb_size = cols*rows; - vtb->vtb_buffer = 0; - vtb->vtb_tail = 0; - - switch (type) { - case VTB_MEMORY: - case VTB_RINGBUFFER: - if ((buf == NULL) && (cols*rows != 0)) { - vtb->vtb_buffer = - (vm_offset_t)malloc(cols*rows*sizeof(u_int16_t)*2, - M_DEVBUF, - ((wait) ? M_WAITOK : M_NOWAIT) | M_ZERO); - if (vtb->vtb_buffer != 0) { - vtb->vtb_flags |= VTB_ALLOCED; - } - } else { - vtb->vtb_buffer = (vm_offset_t)buf; - } - vtb->vtb_flags |= VTB_VALID; - break; - case VTB_FRAMEBUFFER: - vtb->vtb_buffer = (vm_offset_t)buf; - vtb->vtb_flags |= VTB_VALID; - break; - default: - break; - } -} - -void -sc_vtb_destroy(sc_vtb_t *vtb) -{ - vm_offset_t p; - - vtb->vtb_cols = 0; - vtb->vtb_rows = 0; - vtb->vtb_size = 0; - vtb->vtb_tail = 0; - - p = vtb->vtb_buffer; - vtb->vtb_buffer = 0; - switch (vtb->vtb_type) { - case VTB_MEMORY: - case VTB_RINGBUFFER: - if ((vtb->vtb_flags & VTB_ALLOCED) && (p != 0)) - free((void *)p, M_DEVBUF); - break; - default: - break; - } - vtb->vtb_flags = 0; - vtb->vtb_type = VTB_INVALID; -} - -size_t -sc_vtb_size(int cols, int rows) -{ - return (size_t)(cols*rows*sizeof(u_int16_t)*2); -} - -int -sc_vtb_getc(sc_vtb_t *vtb, int at) -{ - vm_offset_t p = vtb_pointer(vtb, at); - - if (vtb->vtb_type == VTB_FRAMEBUFFER) - return (readw(p) & 0x00ff); - else - return (*(u_int16_t *)p & 0x00ff); -} - -int -sc_vtb_geta(sc_vtb_t *vtb, int at) -{ - vm_offset_t p = vtb_pointer(vtb, at); - - if (vtb->vtb_type == VTB_FRAMEBUFFER) - return (readw(p + ATTR_OFFSET_FB) & 0xff00); - else - return (*(u_int16_t *)(p + attr_offset(vtb)) & 0xff00); -} - -static inline void -vtb_putc(sc_vtb_t *vtb, vm_offset_t p, int c, int a) -{ - if (vtb->vtb_type == VTB_FRAMEBUFFER) { - writew(p, c); - writew(p + ATTR_OFFSET_FB, at2pc98(a)); - } else { - *(u_int16_t *)p = c; - *(u_int16_t *)(p + attr_offset(vtb)) = at2pc98(a); - } -} - -void -sc_vtb_putc(sc_vtb_t *vtb, int at, int c, int a) -{ - vtb_putc(vtb, vtb_pointer(vtb, at), c, a); -} - -vm_offset_t -sc_vtb_putchar(sc_vtb_t *vtb, vm_offset_t p, int c, int a) -{ - vtb_putc(vtb, p, c, a); - return (p + sizeof(u_int16_t)); -} - -vm_offset_t -sc_vtb_pointer(sc_vtb_t *vtb, int at) -{ - return (vtb_pointer(vtb, at)); -} - -int -sc_vtb_pos(sc_vtb_t *vtb, int pos, int offset) -{ - return ((pos + offset + vtb->vtb_size)%vtb->vtb_size); -} - -void -sc_vtb_clear(sc_vtb_t *vtb, int c, int attr) -{ - vm_offset_t p = vtb_pointer(vtb, 0); - - if (vtb->vtb_type == VTB_FRAMEBUFFER) { - fillw_io(c, p, vtb->vtb_size); - fillw_io(at2pc98(attr), p + ATTR_OFFSET_FB, vtb->vtb_size); - } else { - fillw(c, (void *)p, vtb->vtb_size); - fillw(at2pc98(attr), (void *)(p + attr_offset(vtb)), - vtb->vtb_size); - } -} - -void -sc_vtb_copy(sc_vtb_t *vtb1, int from, sc_vtb_t *vtb2, int to, int count) -{ - vm_offset_t p1, p2; - - p1 = vtb_pointer(vtb1, from); - p2 = vtb_pointer(vtb2, to); - if (vtb2->vtb_type == VTB_FRAMEBUFFER) { - bcopy_toio(p1, p2, count*sizeof(u_int16_t)); - bcopy_toio(p1 + attr_offset(vtb1), - p2 + ATTR_OFFSET_FB, - count*sizeof(u_int16_t)); - } else if (vtb1->vtb_type == VTB_FRAMEBUFFER) { - bcopy_fromio(p1, p2, count*sizeof(u_int16_t)); - bcopy_fromio(p1 + ATTR_OFFSET_FB, - p2 + attr_offset(vtb2), - count*sizeof(u_int16_t)); - } else { - bcopy((void *)p1, (void *)p2, count*sizeof(u_int16_t)); - bcopy((void *)(p1 + attr_offset(vtb1)), - (void *)(p2 + attr_offset(vtb2)), - count*sizeof(u_int16_t)); - } -} - -void -sc_vtb_append(sc_vtb_t *vtb1, int from, sc_vtb_t *vtb2, int count) -{ - int len; - vm_offset_t p1, p2; - - if (vtb2->vtb_type != VTB_RINGBUFFER) - return; - - while (count > 0) { - p1 = vtb_pointer(vtb1, from); - p2 = vtb_pointer(vtb2, vtb2->vtb_tail); - len = imin(count, vtb2->vtb_size - vtb2->vtb_tail); - if (vtb1->vtb_type == VTB_FRAMEBUFFER) { - bcopy_fromio(p1, p2, len*sizeof(u_int16_t)); - bcopy_fromio(p1 + ATTR_OFFSET_FB, - p2 + attr_offset(vtb2), - len*sizeof(u_int16_t)); - } else { - bcopy((void *)p1, (void *)p2, len*sizeof(u_int16_t)); - bcopy((void *)(p1 + attr_offset(vtb1)), - (void *)(p2 + attr_offset(vtb2)), - len*sizeof(u_int16_t)); - } - from += len; - count -= len; - vtb2->vtb_tail = vtb_wrap(vtb2, vtb2->vtb_tail, len); - } -} - -void -sc_vtb_seek(sc_vtb_t *vtb, int pos) -{ - vtb->vtb_tail = pos%vtb->vtb_size; -} - -void -sc_vtb_erase(sc_vtb_t *vtb, int at, int count, int c, int attr) -{ - vm_offset_t p; - - if (at + count > vtb->vtb_size) - count = vtb->vtb_size - at; - p = vtb_pointer(vtb, at); - if (vtb->vtb_type == VTB_FRAMEBUFFER) { - fillw_io(c, p, count); - fillw_io(at2pc98(attr), p + ATTR_OFFSET_FB, count); - } else { - fillw(c, (void *)p, count); - fillw(at2pc98(attr), (void *)(p + attr_offset(vtb)), count); - } -} - -void -sc_vtb_move(sc_vtb_t *vtb, int from, int to, int count) -{ - vm_offset_t p1, p2; - - if (from + count > vtb->vtb_size) - count = vtb->vtb_size - from; - if (to + count > vtb->vtb_size) - count = vtb->vtb_size - to; - if (count <= 0) - return; - - p1 = vtb_pointer(vtb, from); - p2 = vtb_pointer(vtb, to); - if (vtb->vtb_type == VTB_FRAMEBUFFER) { - bcopy_io(p1, p2, count*sizeof(u_int16_t)); - bcopy_io(p1 + ATTR_OFFSET_FB, - p2 + ATTR_OFFSET_FB, count*sizeof(u_int16_t)); - } else { - bcopy((void *)p1, (void *)p2, count*sizeof(u_int16_t)); - bcopy((void *)(p1 + attr_offset(vtb)), - (void *)(p2 + attr_offset(vtb)), count*sizeof(u_int16_t)); - } -} - -void -sc_vtb_delete(sc_vtb_t *vtb, int at, int count, int c, int attr) -{ - int len; - vm_offset_t p1, p2; - - if (at + count > vtb->vtb_size) - count = vtb->vtb_size - at; - len = vtb->vtb_size - at - count; - if (len > 0) { - p1 = vtb_pointer(vtb, at + count); - p2 = vtb_pointer(vtb, at); - if (vtb->vtb_type == VTB_FRAMEBUFFER) { - bcopy_io(p1, p2, len*sizeof(u_int16_t)); - bcopy_io(p1 + ATTR_OFFSET_FB, - p2 + ATTR_OFFSET_FB, - len*sizeof(u_int16_t)); - } else { - bcopy((void *)p1, (void *)p2, len*sizeof(u_int16_t)); - bcopy((void *)(p1 + attr_offset(vtb)), - (void *)(p2 + attr_offset(vtb)), - len*sizeof(u_int16_t)); - } - } - p1 = vtb_pointer(vtb, at + len); - if (vtb->vtb_type == VTB_FRAMEBUFFER) { - fillw_io(c, p1, vtb->vtb_size - at - len); - fillw_io(at2pc98(attr), p1 + ATTR_OFFSET_FB, - vtb->vtb_size - at - len); - } else { - fillw(c, (void *)p1, vtb->vtb_size - at - len); - fillw(at2pc98(attr), (void *)(p1 + attr_offset(vtb)), - vtb->vtb_size - at - len); - } -} - -void -sc_vtb_ins(sc_vtb_t *vtb, int at, int count, int c, int attr) -{ - vm_offset_t p1, p2; - - p1 = vtb_pointer(vtb, at); - if (at + count > vtb->vtb_size) { - count = vtb->vtb_size - at; - } else { - p2 = vtb_pointer(vtb, at + count); - if (vtb->vtb_type == VTB_FRAMEBUFFER) { - bcopy_io(p1, p2, - (vtb->vtb_size - at - count)*sizeof(u_int16_t)); - bcopy_io(p1 + ATTR_OFFSET_FB, - p2 + ATTR_OFFSET_FB, - (vtb->vtb_size - at - count)*sizeof(u_int16_t)); - } else { - bcopy((void *)p1, (void *)p2, - (vtb->vtb_size - at - count)*sizeof(u_int16_t)); - bcopy((void *)(p1 + attr_offset(vtb)), - (void *)(p2 + attr_offset(vtb)), - (vtb->vtb_size - at - count)*sizeof(u_int16_t)); - } - } - if (vtb->vtb_type == VTB_FRAMEBUFFER) { - fillw_io(c, p1, count); - fillw_io(at2pc98(attr), p1 + ATTR_OFFSET_FB, count); - } else { - fillw(c, (void *)p1, count); - fillw(at2pc98(attr), (void *)(p1 + attr_offset(vtb)), count); - } -} diff --git a/sys/pc98/cbus/sio.c b/sys/pc98/cbus/sio.c deleted file mode 100644 index 3e793680ea2b..000000000000 --- a/sys/pc98/cbus/sio.c +++ /dev/null @@ -1,4387 +0,0 @@ -/*- - * Copyright (c) 1991 The Regents of the University of California. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * $FreeBSD$ - * from: @(#)com.c 7.5 (Berkeley) 5/16/91 - * from: i386/isa sio.c,v 1.234 - */ - -#include "opt_compat.h" -#include "opt_gdb.h" -#include "opt_kdb.h" -#include "opt_sio.h" - -/* - * Serial driver, based on 386BSD-0.1 com driver. - * Mostly rewritten to use pseudo-DMA. - * Works for National Semiconductor NS8250-NS16550AF UARTs. - * COM driver, based on HP dca driver. - * - * Changes for PC Card integration: - * - Added PC Card driver table and handlers - */ -/*=============================================================== - * 386BSD(98),FreeBSD-1.1x(98) com driver. - * ----- - * modified for PC9801 by M.Ishii - * Kyoto University Microcomputer Club (KMC) - * Chou "TEFUTEFU" Hirotomi - * Kyoto Univ. the faculty of medicine - *=============================================================== - * FreeBSD-2.0.1(98) sio driver. - * ----- - * modified for pc98 Internal i8251 and MICRO CORE MC16550II - * T.Koike(hfc01340@niftyserve.or.jp) - * implement kernel device configuration - * aizu@orient.center.nitech.ac.jp - * - * Notes. - * ----- - * PC98 localization based on 386BSD(98) com driver. Using its PC98 local - * functions. - * This driver is under debugging,has bugs. - */ -/* - * modified for AIWA B98-01 - * by T.Hatanou <hatanou@yasuda.comm.waseda.ac.jp> last update: 15 Sep.1995 - */ -/* - * Modified by Y.Takahashi of Kogakuin University. - */ -/* - * modified for 8251(FIFO) by Seigo TANIMURA <tanimura@FreeBSD.org> - */ - -#include <sys/param.h> -#include <sys/systm.h> -#include <sys/bus.h> -#include <sys/conf.h> -#include <sys/fcntl.h> -#include <sys/interrupt.h> -#include <sys/kdb.h> -#include <sys/kernel.h> -#include <sys/limits.h> -#include <sys/lock.h> -#include <sys/malloc.h> -#include <sys/module.h> -#include <sys/mutex.h> -#include <sys/proc.h> -#include <sys/reboot.h> -#include <sys/serial.h> -#include <sys/sysctl.h> -#include <sys/syslog.h> -#include <sys/tty.h> -#include <machine/bus.h> -#include <sys/rman.h> -#include <sys/timepps.h> -#include <sys/uio.h> -#include <sys/cons.h> - -#include <isa/isavar.h> - -#include <machine/resource.h> - -#include <dev/sio/sioreg.h> -#include <dev/sio/siovar.h> - -#ifdef PC98 -#include <pc98/cbus/cbus.h> -#include <pc98/pc98/pc98_machdep.h> -#endif - -#ifdef COM_ESP -#include <dev/ic/esp.h> -#endif -#include <dev/ic/ns16550.h> -#ifdef PC98 -#include <dev/ic/i8251.h> -#include <dev/ic/i8255.h> -#include <dev/ic/rsa.h> -#endif - -#define LOTS_OF_EVENTS 64 /* helps separate urgent events from input */ - -/* - * Meaning of flags: - * - * 0x00000001 shared IRQs - * 0x00000002 disable FIFO - * 0x00000008 recover sooner from lost output interrupts - * 0x00000010 device is potential system console - * 0x00000020 device is forced to become system console - * 0x00000040 device is reserved for low-level IO - * 0x00000080 use this port for remote kernel debugging - * 0x0000??00 minor number of master port - * 0x00010000 PPS timestamping on CTS instead of DCD - * 0x00080000 IIR_TXRDY bug - * 0x00400000 If no comconsole found then mark as a comconsole - * 0x1?000000 interface type - */ - -#ifdef COM_MULTIPORT -/* checks in flags for multiport and which is multiport "master chip" - * for a given card - */ -#define COM_ISMULTIPORT(flags) ((flags) & 0x01) -#define COM_MPMASTER(flags) (((flags) >> 8) & 0x0ff) -#ifndef PC98 -#define COM_NOTAST4(flags) ((flags) & 0x04) -#endif -#else -#define COM_ISMULTIPORT(flags) (0) -#endif /* COM_MULTIPORT */ - -#define COM_C_IIR_TXRDYBUG 0x80000 -#define COM_CONSOLE(flags) ((flags) & 0x10) -#define COM_DEBUGGER(flags) ((flags) & 0x80) -#ifndef PC98 -#define COM_FIFOSIZE(flags) (((flags) & 0xff000000) >> 24) -#endif -#define COM_FORCECONSOLE(flags) ((flags) & 0x20) -#define COM_IIR_TXRDYBUG(flags) ((flags) & COM_C_IIR_TXRDYBUG) -#define COM_LLCONSOLE(flags) ((flags) & 0x40) -#define COM_LOSESOUTINTS(flags) ((flags) & 0x08) -#define COM_NOFIFO(flags) ((flags) & 0x02) -#ifndef PC98 -#define COM_NOSCR(flags) ((flags) & 0x100000) -#endif -#define COM_PPSCTS(flags) ((flags) & 0x10000) -#ifndef PC98 -#define COM_ST16650A(flags) ((flags) & 0x20000) -#define COM_TI16754(flags) ((flags) & 0x200000) -#endif - -#define sio_getreg(com, off) \ - (bus_space_read_1((com)->bst, (com)->bsh, (off))) -#define sio_setreg(com, off, value) \ - (bus_space_write_1((com)->bst, (com)->bsh, (off), (value))) - -/* - * com state bits. - * (CS_BUSY | CS_TTGO) and (CS_BUSY | CS_TTGO | CS_ODEVREADY) must be higher - * than the other bits so that they can be tested as a group without masking - * off the low bits. - * - * The following com and tty flags correspond closely: - * CS_BUSY = TS_BUSY (maintained by comstart(), siopoll() and - * comstop()) - * CS_TTGO = ~TS_TTSTOP (maintained by comparam() and comstart()) - * CS_CTS_OFLOW = CCTS_OFLOW (maintained by comparam()) - * CS_RTS_IFLOW = CRTS_IFLOW (maintained by comparam()) - * TS_FLUSH is not used. - * XXX I think TIOCSETA doesn't clear TS_TTSTOP when it clears IXON. - * XXX CS_*FLOW should be CF_*FLOW in com->flags (control flags not state). - */ -#define CS_BUSY 0x80 /* output in progress */ -#define CS_TTGO 0x40 /* output not stopped by XOFF */ -#define CS_ODEVREADY 0x20 /* external device h/w ready (CTS) */ -#define CS_CHECKMSR 1 /* check of MSR scheduled */ -#define CS_CTS_OFLOW 2 /* use CTS output flow control */ -#define CS_ODONE 4 /* output completed */ -#define CS_RTS_IFLOW 8 /* use RTS input flow control */ -#define CSE_BUSYCHECK 1 /* siobusycheck() scheduled */ - -static char const * const error_desc[] = { -#define CE_OVERRUN 0 - "silo overflow", -#define CE_INTERRUPT_BUF_OVERFLOW 1 - "interrupt-level buffer overflow", -#define CE_TTY_BUF_OVERFLOW 2 - "tty-level buffer overflow", -}; - -#define CE_NTYPES 3 -#define CE_RECORD(com, errnum) (++(com)->delta_error_counts[errnum]) - -/* types. XXX - should be elsewhere */ -typedef u_int Port_t; /* hardware port */ -typedef u_char bool_t; /* boolean */ - -/* queue of linear buffers */ -struct lbq { - u_char *l_head; /* next char to process */ - u_char *l_tail; /* one past the last char to process */ - struct lbq *l_next; /* next in queue */ - bool_t l_queued; /* nonzero if queued */ -}; - -/* com device structure */ -struct com_s { - u_char state; /* miscellaneous flag bits */ - u_char cfcr_image; /* copy of value written to CFCR */ -#ifdef COM_ESP - bool_t esp; /* is this unit a hayes esp board? */ -#endif - u_char extra_state; /* more flag bits, separate for order trick */ - u_char fifo_image; /* copy of value written to FIFO */ - bool_t hasfifo; /* nonzero for 16550 UARTs */ - bool_t loses_outints; /* nonzero if device loses output interrupts */ - u_char mcr_image; /* copy of value written to MCR */ -#ifdef COM_MULTIPORT - bool_t multiport; /* is this unit part of a multiport device? */ -#endif /* COM_MULTIPORT */ - bool_t no_irq; /* nonzero if irq is not attached */ - bool_t gone; /* hardware disappeared */ - bool_t poll; /* nonzero if polling is required */ - bool_t poll_output; /* nonzero if polling for output is required */ - bool_t st16650a; /* nonzero if Startech 16650A compatible */ - int unit; /* unit number */ - u_int flags; /* copy of device flags */ - u_int tx_fifo_size; - - /* - * The high level of the driver never reads status registers directly - * because there would be too many side effects to handle conveniently. - * Instead, it reads copies of the registers stored here by the - * interrupt handler. - */ - u_char last_modem_status; /* last MSR read by intr handler */ - u_char prev_modem_status; /* last MSR handled by high level */ - - u_char *ibuf; /* start of input buffer */ - u_char *ibufend; /* end of input buffer */ - u_char *ibufold; /* old input buffer, to be freed */ - u_char *ihighwater; /* threshold in input buffer */ - u_char *iptr; /* next free spot in input buffer */ - int ibufsize; /* size of ibuf (not include error bytes) */ - int ierroff; /* offset of error bytes in ibuf */ - - struct lbq obufq; /* head of queue of output buffers */ - struct lbq obufs[2]; /* output buffers */ - - bus_space_tag_t bst; - bus_space_handle_t bsh; - -#ifdef PC98 - Port_t cmd_port; - Port_t sts_port; - Port_t in_modem_port; - Port_t intr_ctrl_port; - Port_t rsabase; /* Iobase address of an I/O-DATA RSA board. */ - int intr_enable; - int pc98_prev_modem_status; - int pc98_modem_delta; - int modem_car_chg_timer; - int pc98_prev_siocmd; - int pc98_prev_siomod; - int modem_checking; - int pc98_if_type; - - bool_t pc98_8251fifo; - bool_t pc98_8251fifo_enable; -#endif /* PC98 */ - Port_t data_port; /* i/o ports */ -#ifdef COM_ESP - Port_t esp_port; -#endif - Port_t int_ctl_port; - Port_t int_id_port; - Port_t modem_ctl_port; - Port_t line_status_port; - Port_t modem_status_port; - - struct tty *tp; /* cross reference */ - - struct pps_state pps; - int pps_bit; -#ifdef KDB - int alt_brk_state; -#endif - - u_long bytes_in; /* statistics */ - u_long bytes_out; - u_int delta_error_counts[CE_NTYPES]; - u_long error_counts[CE_NTYPES]; - - u_long rclk; - - struct resource *irqres; - struct resource *ioportres; - int ioportrid; - void *cookie; - - /* - * Data area for output buffers. Someday we should build the output - * buffer queue without copying data. - */ -#ifdef PC98 - int obufsize; - u_char *obuf1; - u_char *obuf2; -#else - u_char obuf1[256]; - u_char obuf2[256]; -#endif -}; - -#ifdef COM_ESP -static int espattach(struct com_s *com, Port_t esp_port); -#endif - -static void combreak(struct tty *tp, int sig); -static timeout_t siobusycheck; -static u_int siodivisor(u_long rclk, speed_t speed); -static void comclose(struct tty *tp); -static int comopen(struct tty *tp, struct cdev *dev); -static void sioinput(struct com_s *com); -static void siointr1(struct com_s *com); -static int siointr(void *arg); -static int commodem(struct tty *tp, int sigon, int sigoff); -static int comparam(struct tty *tp, struct termios *t); -static void siopoll(void *); -static void siosettimeout(void); -static int siosetwater(struct com_s *com, speed_t speed); -static void comstart(struct tty *tp); -static void comstop(struct tty *tp, int rw); -static timeout_t comwakeup; - -char sio_driver_name[] = "sio"; -static struct mtx sio_lock; -static int sio_inited; - -/* table and macro for fast conversion from a unit number to its com struct */ -devclass_t sio_devclass; -#define com_addr(unit) ((struct com_s *) \ - devclass_get_softc(sio_devclass, unit)) /* XXX */ - -int comconsole = -1; -static volatile speed_t comdefaultrate = CONSPEED; -static u_long comdefaultrclk = DEFAULT_RCLK; -SYSCTL_ULONG(_machdep, OID_AUTO, conrclk, CTLFLAG_RW, &comdefaultrclk, 0, ""); -static speed_t gdbdefaultrate = GDBSPEED; -SYSCTL_UINT(_machdep, OID_AUTO, gdbspeed, CTLFLAG_RW, - &gdbdefaultrate, GDBSPEED, ""); -static u_int com_events; /* input chars + weighted output completions */ -static Port_t siocniobase; -static int siocnunit = -1; -static void *sio_slow_ih; -static void *sio_fast_ih; -static int sio_timeout; -static int sio_timeouts_until_log; -static struct callout_handle sio_timeout_handle - = CALLOUT_HANDLE_INITIALIZER(&sio_timeout_handle); -static int sio_numunits; - -#ifdef PC98 -struct siodev { - short if_type; - short irq; - Port_t cmd, sts, ctrl, mod; -}; -static int sysclock; - -#define COM_INT_DISABLE {int previpri; previpri=spltty(); -#define COM_INT_ENABLE splx(previpri);} -#define IEN_TxFLAG IEN_Tx - -#define COM_CARRIER_DETECT_EMULATE 0 -#define PC98_CHECK_MODEM_INTERVAL (hz/10) -#define DCD_OFF_TOLERANCE 2 -#define DCD_ON_RECOGNITION 2 -#define IS_8251(if_type) (!(if_type & 0x10)) -#define COM1_EXT_CLOCK 0x40000 - -static void commint(struct cdev *dev); -static void com_tiocm_bis(struct com_s *com, int msr); -static void com_tiocm_bic(struct com_s *com, int msr); -static int com_tiocm_get(struct com_s *com); -static int com_tiocm_get_delta(struct com_s *com); -static void pc98_msrint_start(struct cdev *dev); -static void com_cflag_and_speed_set(struct com_s *com, int cflag, int speed); -static int pc98_ttspeedtab(struct com_s *com, int speed, u_int *divisor); -static int pc98_get_modem_status(struct com_s *com); -static timeout_t pc98_check_msr; -static void pc98_set_baud_rate(struct com_s *com, u_int count); -static void pc98_i8251_reset(struct com_s *com, int mode, int command); -static void pc98_disable_i8251_interrupt(struct com_s *com, int mod); -static void pc98_enable_i8251_interrupt(struct com_s *com, int mod); -static int pc98_check_i8251_interrupt(struct com_s *com); -static int pc98_i8251_get_cmd(struct com_s *com); -static int pc98_i8251_get_mod(struct com_s *com); -static void pc98_i8251_set_cmd(struct com_s *com, int x); -static void pc98_i8251_or_cmd(struct com_s *com, int x); -static void pc98_i8251_clear_cmd(struct com_s *com, int x); -static void pc98_i8251_clear_or_cmd(struct com_s *com, int clr, int x); -static int pc98_check_if_type(device_t dev, struct siodev *iod); -static int pc98_check_8251vfast(void); -static int pc98_check_8251fifo(void); -static void pc98_check_sysclock(void); -static void pc98_set_ioport(struct com_s *com); - -#define com_int_Tx_disable(com) \ - pc98_disable_i8251_interrupt(com,IEN_Tx|IEN_TxEMP) -#define com_int_Tx_enable(com) \ - pc98_enable_i8251_interrupt(com,IEN_TxFLAG) -#define com_int_Rx_disable(com) \ - pc98_disable_i8251_interrupt(com,IEN_Rx) -#define com_int_Rx_enable(com) \ - pc98_enable_i8251_interrupt(com,IEN_Rx) -#define com_int_TxRx_disable(com) \ - pc98_disable_i8251_interrupt(com,IEN_Tx|IEN_TxEMP|IEN_Rx) -#define com_int_TxRx_enable(com) \ - pc98_enable_i8251_interrupt(com,IEN_TxFLAG|IEN_Rx) -#define com_send_break_on(com) \ - (IS_8251((com)->pc98_if_type) ? \ - pc98_i8251_or_cmd((com), CMD8251_SBRK) : \ - sio_setreg((com), com_cfcr, (com)->cfcr_image |= CFCR_SBREAK)) -#define com_send_break_off(com) \ - (IS_8251((com)->pc98_if_type) ? \ - pc98_i8251_clear_cmd((com), CMD8251_SBRK) : \ - sio_setreg((com), com_cfcr, (com)->cfcr_image &= ~CFCR_SBREAK)) - -static struct speedtab pc98speedtab[] = { /* internal RS232C interface */ - { 0, 0, }, - { 50, 50, }, - { 75, 75, }, - { 150, 150, }, - { 200, 200, }, - { 300, 300, }, - { 600, 600, }, - { 1200, 1200, }, - { 2400, 2400, }, - { 4800, 4800, }, - { 9600, 9600, }, - { 19200, 19200, }, - { 38400, 38400, }, - { 51200, 51200, }, - { 76800, 76800, }, - { 20800, 20800, }, - { 31200, 31200, }, - { 41600, 41600, }, - { 62400, 62400, }, - { -1, -1 } -}; -static struct speedtab pc98fast_speedtab[] = { - { 9600, 0x80 | (DEFAULT_RCLK / (16 * (9600))), }, - { 19200, 0x80 | (DEFAULT_RCLK / (16 * (19200))), }, - { 38400, 0x80 | (DEFAULT_RCLK / (16 * (38400))), }, - { 57600, 0x80 | (DEFAULT_RCLK / (16 * (57600))), }, - { 115200, 0x80 | (DEFAULT_RCLK / (16 * (115200))), }, - { -1, -1 } -}; -static struct speedtab comspeedtab_pio9032b[] = { - { 300, 6, }, - { 600, 5, }, - { 1200, 4, }, - { 2400, 3, }, - { 4800, 2, }, - { 9600, 1, }, - { 19200, 0, }, - { 38400, 7, }, - { -1, -1 } -}; -static struct speedtab comspeedtab_b98_01[] = { - { 75, 11, }, - { 150, 10, }, - { 300, 9, }, - { 600, 8, }, - { 1200, 7, }, - { 2400, 6, }, - { 4800, 5, }, - { 9600, 4, }, - { 19200, 3, }, - { 38400, 2, }, - { 76800, 1, }, - { 153600, 0, }, - { -1, -1 } -}; -static struct speedtab comspeedtab_ind[] = { - { 300, 1536, }, - { 600, 768, }, - { 1200, 384, }, - { 2400, 192, }, - { 4800, 96, }, - { 9600, 48, }, - { 19200, 24, }, - { 38400, 12, }, - { 57600, 8, }, - { 115200, 4, }, - { 153600, 3, }, - { 230400, 2, }, - { 460800, 1, }, - { -1, -1 } -}; - -struct { - char *name; - short port_table[7]; - short irr_mask; - struct speedtab *speedtab; - short check_irq; -} if_8251_type[] = { - /* COM_IF_INTERNAL */ - { " (internal)", {0x30, 0x32, 0x32, 0x33, 0x35, -1, -1}, - -1, pc98speedtab, 1 }, - /* COM_IF_PC9861K_1 */ - { " (PC9861K)", {0xb1, 0xb3, 0xb3, 0xb0, 0xb0, -1, -1}, - 3, NULL, 1 }, - /* COM_IF_PC9861K_2 */ - { " (PC9861K)", {0xb9, 0xbb, 0xbb, 0xb2, 0xb2, -1, -1}, - 3, NULL, 1 }, - /* COM_IF_IND_SS_1 */ - { " (IND-SS)", {0xb1, 0xb3, 0xb3, 0xb0, 0xb0, 0xb3, -1}, - 3, comspeedtab_ind, 1 }, - /* COM_IF_IND_SS_2 */ - { " (IND-SS)", {0xb9, 0xbb, 0xbb, 0xb2, 0xb2, 0xbb, -1}, - 3, comspeedtab_ind, 1 }, - /* COM_IF_PIO9032B_1 */ - { " (PIO9032B)", {0xb1, 0xb3, 0xb3, 0xb0, 0xb0, 0xb8, -1}, - 7, comspeedtab_pio9032b, 1 }, - /* COM_IF_PIO9032B_2 */ - { " (PIO9032B)", {0xb9, 0xbb, 0xbb, 0xb2, 0xb2, 0xba, -1}, - 7, comspeedtab_pio9032b, 1 }, - /* COM_IF_B98_01_1 */ - { " (B98-01)", {0xb1, 0xb3, 0xb3, 0xb0, 0xb0, 0xd1, 0xd3}, - 7, comspeedtab_b98_01, 0 }, - /* COM_IF_B98_01_2 */ - { " (B98-01)", {0xb9, 0xbb, 0xbb, 0xb2, 0xb2, 0xd5, 0xd7}, - 7, comspeedtab_b98_01, 0 }, -}; -#define PC98SIO_data_port(type) (if_8251_type[type].port_table[0]) -#define PC98SIO_cmd_port(type) (if_8251_type[type].port_table[1]) -#define PC98SIO_sts_port(type) (if_8251_type[type].port_table[2]) -#define PC98SIO_in_modem_port(type) (if_8251_type[type].port_table[3]) -#define PC98SIO_intr_ctrl_port(type) (if_8251_type[type].port_table[4]) -#define PC98SIO_baud_rate_port(type) (if_8251_type[type].port_table[5]) -#define PC98SIO_func_port(type) (if_8251_type[type].port_table[6]) - -#define I8251F_data 0x130 -#define I8251F_lsr 0x132 -#define I8251F_msr 0x134 -#define I8251F_iir 0x136 -#define I8251F_fcr 0x138 -#define I8251F_div 0x13a - - -static bus_addr_t port_table_0[] = - {0x000, 0x001, 0x002, 0x003, 0x004, 0x005, 0x006, 0x007}; -static bus_addr_t port_table_1[] = - {0x000, 0x002, 0x004, 0x006, 0x008, 0x00a, 0x00c, 0x00e}; -static bus_addr_t port_table_8[] = - {0x000, 0x100, 0x200, 0x300, 0x400, 0x500, 0x600, 0x700}; -static bus_addr_t port_table_rsa[] = { - 0x008, 0x009, 0x00a, 0x00b, 0x00c, 0x00d, 0x00e, 0x00f, - 0x000, 0x001, 0x002, 0x003, 0x004, 0x005, 0x006, 0x007 -}; - -struct { - char *name; - short irr_read; - short irr_write; - bus_addr_t *iat; - bus_size_t iatsz; - u_long rclk; -} if_16550a_type[] = { - /* COM_IF_RSA98 */ - {" (RSA-98)", -1, -1, port_table_0, IO_COMSIZE, DEFAULT_RCLK}, - /* COM_IF_NS16550 */ - {"", -1, -1, port_table_0, IO_COMSIZE, DEFAULT_RCLK}, - /* COM_IF_SECOND_CCU */ - {"", -1, -1, port_table_0, IO_COMSIZE, DEFAULT_RCLK}, - /* COM_IF_MC16550II */ - {" (MC16550II)", -1, 0x1000, port_table_8, IO_COMSIZE, - DEFAULT_RCLK * 4}, - /* COM_IF_MCRS98 */ - {" (MC-RS98)", -1, 0x1000, port_table_8, IO_COMSIZE, DEFAULT_RCLK * 4}, - /* COM_IF_RSB3000 */ - {" (RSB-3000)", 0xbf, -1, port_table_1, IO_COMSIZE, DEFAULT_RCLK * 10}, - /* COM_IF_RSB384 */ - {" (RSB-384)", 0xbf, -1, port_table_1, IO_COMSIZE, DEFAULT_RCLK * 10}, - /* COM_IF_MODEM_CARD */ - {"", -1, -1, port_table_0, IO_COMSIZE, DEFAULT_RCLK}, - /* COM_IF_RSA98III */ - {" (RSA-98III)", -1, -1, port_table_rsa, 16, DEFAULT_RCLK * 8}, - /* COM_IF_ESP98 */ - {" (ESP98)", -1, -1, port_table_1, IO_COMSIZE, DEFAULT_RCLK * 4}, -}; -#endif /* PC98 */ - -#ifdef GDB -static Port_t siogdbiobase = 0; -#endif - -#ifdef COM_ESP -#ifdef PC98 - -/* XXX configure this properly. */ -/* XXX quite broken for new-bus. */ -static Port_t likely_com_ports[] = { 0, 0xb0, 0xb1, 0 }; -static Port_t likely_esp_ports[] = { 0xc0d0, 0 }; - -#define ESP98_CMD1 (ESP_CMD1 * 0x100) -#define ESP98_CMD2 (ESP_CMD2 * 0x100) -#define ESP98_STATUS1 (ESP_STATUS1 * 0x100) -#define ESP98_STATUS2 (ESP_STATUS2 * 0x100) - -#else /* PC98 */ - -/* XXX configure this properly. */ -static Port_t likely_com_ports[] = { 0x3f8, 0x2f8, 0x3e8, 0x2e8, }; -static Port_t likely_esp_ports[] = { 0x140, 0x180, 0x280, 0 }; - -#endif /* PC98 */ -#endif - -/* - * handle sysctl read/write requests for console speed - * - * In addition to setting comdefaultrate for I/O through /dev/console, - * also set the initial and lock values for the /dev/ttyXX device - * if there is one associated with the console. Finally, if the /dev/tty - * device has already been open, change the speed on the open running port - * itself. - */ - -static int -sysctl_machdep_comdefaultrate(SYSCTL_HANDLER_ARGS) -{ - int error, s; - speed_t newspeed; - struct com_s *com; - struct tty *tp; - - newspeed = comdefaultrate; - - error = sysctl_handle_opaque(oidp, &newspeed, sizeof newspeed, req); - if (error || !req->newptr) - return (error); - - comdefaultrate = newspeed; - - if (comconsole < 0) /* serial console not selected? */ - return (0); - - com = com_addr(comconsole); - if (com == NULL) - return (ENXIO); - - tp = com->tp; - if (tp == NULL) - return (ENXIO); - - /* - * set the initial and lock rates for /dev/ttydXX and /dev/cuaXX - * (note, the lock rates really are boolean -- if non-zero, disallow - * speed changes) - */ - tp->t_init_in.c_ispeed = tp->t_init_in.c_ospeed = - tp->t_lock_in.c_ispeed = tp->t_lock_in.c_ospeed = - tp->t_init_out.c_ispeed = tp->t_init_out.c_ospeed = - tp->t_lock_out.c_ispeed = tp->t_lock_out.c_ospeed = comdefaultrate; - - if (tp->t_state & TS_ISOPEN) { - tp->t_termios.c_ispeed = - tp->t_termios.c_ospeed = comdefaultrate; - s = spltty(); - error = comparam(tp, &tp->t_termios); - splx(s); - } - return error; -} - -SYSCTL_PROC(_machdep, OID_AUTO, conspeed, CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_NOFETCH, - 0, 0, sysctl_machdep_comdefaultrate, "I", ""); -TUNABLE_INT("machdep.conspeed", __DEVOLATILE(int *, &comdefaultrate)); - -/* - * Unload the driver and clear the table. - * XXX this is mostly wrong. - * XXX TODO: - * This is usually called when the card is ejected, but - * can be caused by a kldunload of a controller driver. - * The idea is to reset the driver's view of the device - * and ensure that any driver entry points such as - * read and write do not hang. - */ -int -siodetach(device_t dev) -{ - struct com_s *com; - - com = (struct com_s *) device_get_softc(dev); - if (com == NULL) { - device_printf(dev, "NULL com in siounload\n"); - return (0); - } - com->gone = TRUE; - if (com->tp) - ttyfree(com->tp); - if (com->irqres) { - bus_teardown_intr(dev, com->irqres, com->cookie); - bus_release_resource(dev, SYS_RES_IRQ, 0, com->irqres); - } - if (com->ioportres) - bus_release_resource(dev, SYS_RES_IOPORT, com->ioportrid, - com->ioportres); - if (com->ibuf != NULL) - free(com->ibuf, M_DEVBUF); -#ifdef PC98 - if (com->obuf1 != NULL) - free(com->obuf1, M_DEVBUF); -#endif - - device_set_softc(dev, NULL); - free(com, M_DEVBUF); - return (0); -} - -int -sioprobe(dev, xrid, rclk, noprobe) - device_t dev; - int xrid; - u_long rclk; - int noprobe; -{ -#if 0 - static bool_t already_init; - device_t xdev; -#endif - struct com_s *com; - u_int divisor; - bool_t failures[10]; - int fn; - device_t idev; - Port_t iobase; - intrmask_t irqmap[4]; - intrmask_t irqs; - u_char mcr_image; - int result; - u_long xirq; - u_int flags = device_get_flags(dev); - int rid; - struct resource *port; -#ifdef PC98 - int tmp; - struct siodev iod; -#endif - -#ifdef PC98 - iod.if_type = GET_IFTYPE(flags); - if ((iod.if_type < 0 || iod.if_type > COM_IF_END1) && - (iod.if_type < 0x10 || iod.if_type > COM_IF_END2)) - return ENXIO; -#endif - - rid = xrid; -#ifdef PC98 - if (IS_8251(iod.if_type)) { - port = bus_alloc_resource_any(dev, SYS_RES_IOPORT, &rid, - RF_ACTIVE); - } else if (iod.if_type == COM_IF_MODEM_CARD || - iod.if_type == COM_IF_RSA98III || - isa_get_vendorid(dev)) { - port = bus_alloc_resource_anywhere(dev, SYS_RES_IOPORT, &rid, - if_16550a_type[iod.if_type & 0x0f].iatsz, RF_ACTIVE); - } else { - port = isa_alloc_resourcev(dev, SYS_RES_IOPORT, &rid, - if_16550a_type[iod.if_type & 0x0f].iat, - if_16550a_type[iod.if_type & 0x0f].iatsz, RF_ACTIVE); - } -#else - port = bus_alloc_resource_anywhere(dev, SYS_RES_IOPORT, &rid, - IO_COMSIZE, RF_ACTIVE); -#endif - if (!port) - return (ENXIO); -#ifdef PC98 - if (!IS_8251(iod.if_type)) { - if (isa_load_resourcev(port, - if_16550a_type[iod.if_type & 0x0f].iat, - if_16550a_type[iod.if_type & 0x0f].iatsz) != 0) { - bus_release_resource(dev, SYS_RES_IOPORT, rid, port); - return ENXIO; - } - } -#endif - - com = malloc(sizeof(*com), M_DEVBUF, M_NOWAIT | M_ZERO); - if (com == NULL) { - bus_release_resource(dev, SYS_RES_IOPORT, rid, port); - return (ENOMEM); - } - device_set_softc(dev, com); - com->bst = rman_get_bustag(port); - com->bsh = rman_get_bushandle(port); -#ifdef PC98 - if (!IS_8251(iod.if_type) && rclk == 0) - rclk = if_16550a_type[iod.if_type & 0x0f].rclk; -#else - if (rclk == 0) - rclk = DEFAULT_RCLK; -#endif - com->rclk = rclk; - - while (sio_inited != 2) - if (atomic_cmpset_int(&sio_inited, 0, 1)) { - mtx_init(&sio_lock, sio_driver_name, NULL, - (comconsole != -1) ? - MTX_SPIN | MTX_QUIET : MTX_SPIN); - atomic_store_rel_int(&sio_inited, 2); - } - -#if 0 - /* - * XXX this is broken - when we are first called, there are no - * previously configured IO ports. We could hard code - * 0x3f8, 0x2f8, 0x3e8, 0x2e8 etc but that's probably worse. - * This code has been doing nothing since the conversion since - * "count" is zero the first time around. - */ - if (!already_init) { - /* - * Turn off MCR_IENABLE for all likely serial ports. An unused - * port with its MCR_IENABLE gate open will inhibit interrupts - * from any used port that shares the interrupt vector. - * XXX the gate enable is elsewhere for some multiports. - */ - device_t *devs; - int count, i, xioport; -#ifdef PC98 - int xiftype; -#endif - - devclass_get_devices(sio_devclass, &devs, &count); -#ifdef PC98 - for (i = 0; i < count; i++) { - xdev = devs[i]; - xioport = bus_get_resource_start(xdev, SYS_RES_IOPORT, 0); - xiftype = GET_IFTYPE(device_get_flags(xdev)); - if (device_is_enabled(xdev) && xioport > 0) { - if (IS_8251(xiftype)) - outb((xioport & 0xff00) | PC98SIO_cmd_port(xiftype & 0x0f), 0xf2); - else - outb(xioport + if_16550a_type[xiftype & 0x0f].iat[com_mcr], 0); - } - } -#else - for (i = 0; i < count; i++) { - xdev = devs[i]; - if (device_is_enabled(xdev) && - bus_get_resource(xdev, SYS_RES_IOPORT, 0, &xioport, - NULL) == 0) - outb(xioport + com_mcr, 0); - } -#endif - free(devs, M_TEMP); - already_init = TRUE; - } -#endif - - if (COM_LLCONSOLE(flags)) { - printf("sio%d: reserved for low-level i/o\n", - device_get_unit(dev)); - bus_release_resource(dev, SYS_RES_IOPORT, rid, port); - device_set_softc(dev, NULL); - free(com, M_DEVBUF); - return (ENXIO); - } - -#ifdef PC98 - DELAY(10); - - /* - * If the port is i8251 UART (internal, B98_01) - */ - if (pc98_check_if_type(dev, &iod) == -1) { - bus_release_resource(dev, SYS_RES_IOPORT, rid, port); - device_set_softc(dev, NULL); - free(com, M_DEVBUF); - return (ENXIO); - } - if (iod.irq > 0) - bus_set_resource(dev, SYS_RES_IRQ, 0, iod.irq, 1); - if (IS_8251(iod.if_type)) { - outb(iod.cmd, 0); - DELAY(10); - outb(iod.cmd, 0); - DELAY(10); - outb(iod.cmd, 0); - DELAY(10); - outb(iod.cmd, CMD8251_RESET); - DELAY(1000); /* for a while...*/ - outb(iod.cmd, 0xf2); /* MODE (dummy) */ - DELAY(10); - outb(iod.cmd, 0x01); /* CMD (dummy) */ - DELAY(1000); /* for a while...*/ - if (( inb(iod.sts) & STS8251_TxEMP ) == 0 ) { - result = (ENXIO); - } - if (if_8251_type[iod.if_type & 0x0f].check_irq) { - COM_INT_DISABLE - tmp = ( inb( iod.ctrl ) & ~(IEN_Rx|IEN_TxEMP|IEN_Tx)); - outb( iod.ctrl, tmp|IEN_TxEMP ); - DELAY(10); - result = isa_irq_pending() ? 0 : ENXIO; - outb( iod.ctrl, tmp ); - COM_INT_ENABLE - } else { - /* - * B98_01 doesn't activate TxEMP interrupt line - * when being reset, so we can't check irq pending. - */ - result = 0; - } - bus_release_resource(dev, SYS_RES_IOPORT, rid, port); - if (result) { - device_set_softc(dev, NULL); - free(com, M_DEVBUF); - } - return result; - } -#endif /* PC98 */ - /* - * If the device is on a multiport card and has an AST/4 - * compatible interrupt control register, initialize this - * register and prepare to leave MCR_IENABLE clear in the mcr. - * Otherwise, prepare to set MCR_IENABLE in the mcr. - * Point idev to the device struct giving the correct id_irq. - * This is the struct for the master device if there is one. - */ - idev = dev; - mcr_image = MCR_IENABLE; -#ifdef COM_MULTIPORT - if (COM_ISMULTIPORT(flags)) { -#ifndef PC98 - Port_t xiobase; - u_long io; -#endif - - idev = devclass_get_device(sio_devclass, COM_MPMASTER(flags)); - if (idev == NULL) { - printf("sio%d: master device %d not configured\n", - device_get_unit(dev), COM_MPMASTER(flags)); - idev = dev; - } -#ifndef PC98 - if (!COM_NOTAST4(flags)) { - if (bus_get_resource(idev, SYS_RES_IOPORT, 0, &io, - NULL) == 0) { - xiobase = io; - if (bus_get_resource(idev, SYS_RES_IRQ, 0, - NULL, NULL) == 0) - outb(xiobase + com_scr, 0x80); - else - outb(xiobase + com_scr, 0); - } - mcr_image = 0; - } -#endif - } -#endif /* COM_MULTIPORT */ - if (bus_get_resource(idev, SYS_RES_IRQ, 0, NULL, NULL) != 0) - mcr_image = 0; - - bzero(failures, sizeof failures); - iobase = rman_get_start(port); - -#ifdef PC98 - if (iod.if_type == COM_IF_RSA98III) { - mcr_image = 0; - - outb(iobase + rsa_msr, 0x04); - outb(iobase + rsa_frr, 0x00); - if ((inb(iobase + rsa_srr) & 0x36) != 0x36) { - bus_release_resource(dev, SYS_RES_IOPORT, rid, port); - device_set_softc(dev, NULL); - free(com, M_DEVBUF); - return (ENXIO); - } - outb(iobase + rsa_ier, 0x00); - outb(iobase + rsa_frr, 0x00); - outb(iobase + rsa_tivsr, 0x00); - outb(iobase + rsa_tcr, 0x00); - } - - tmp = if_16550a_type[iod.if_type & 0x0f].irr_write; - if (tmp != -1) { - /* MC16550II */ - int irqout; - switch (isa_get_irq(idev)) { - case 3: irqout = 4; break; - case 5: irqout = 5; break; - case 6: irqout = 6; break; - case 12: irqout = 7; break; - default: - printf("sio%d: irq configuration error\n", - device_get_unit(dev)); - bus_release_resource(dev, SYS_RES_IOPORT, rid, port); - device_set_softc(dev, NULL); - free(com, M_DEVBUF); - return (ENXIO); - } - outb((iobase & 0x00ff) | tmp, irqout); - } -#endif - - /* - * We don't want to get actual interrupts, just masked ones. - * Interrupts from this line should already be masked in the ICU, - * but mask them in the processor as well in case there are some - * (misconfigured) shared interrupts. - */ - mtx_lock_spin(&sio_lock); -/* EXTRA DELAY? */ - - /* - * Initialize the speed and the word size and wait long enough to - * drain the maximum of 16 bytes of junk in device output queues. - * The speed is undefined after a master reset and must be set - * before relying on anything related to output. There may be - * junk after a (very fast) soft reboot and (apparently) after - * master reset. - * XXX what about the UART bug avoided by waiting in comparam()? - * We don't want to to wait long enough to drain at 2 bps. - */ - if (iobase == siocniobase) - DELAY((16 + 1) * 1000000 / (comdefaultrate / 10)); - else { - sio_setreg(com, com_cfcr, CFCR_DLAB | CFCR_8BITS); - divisor = siodivisor(rclk, SIO_TEST_SPEED); - sio_setreg(com, com_dlbl, divisor & 0xff); - sio_setreg(com, com_dlbh, divisor >> 8); - sio_setreg(com, com_cfcr, CFCR_8BITS); - DELAY((16 + 1) * 1000000 / (SIO_TEST_SPEED / 10)); - } - - /* - * Enable the interrupt gate and disable device interrupts. This - * should leave the device driving the interrupt line low and - * guarantee an edge trigger if an interrupt can be generated. - */ -/* EXTRA DELAY? */ - sio_setreg(com, com_mcr, mcr_image); - sio_setreg(com, com_ier, 0); - DELAY(1000); /* XXX */ - irqmap[0] = isa_irq_pending(); - - /* - * Attempt to set loopback mode so that we can send a null byte - * without annoying any external device. - */ -/* EXTRA DELAY? */ - sio_setreg(com, com_mcr, mcr_image | MCR_LOOPBACK); - - /* - * Attempt to generate an output interrupt. On 8250's, setting - * IER_ETXRDY generates an interrupt independent of the current - * setting and independent of whether the THR is empty. On 16450's, - * setting IER_ETXRDY generates an interrupt independent of the - * current setting. On 16550A's, setting IER_ETXRDY only - * generates an interrupt when IER_ETXRDY is not already set. - */ - sio_setreg(com, com_ier, IER_ETXRDY); -#ifdef PC98 - if (iod.if_type == COM_IF_RSA98III) - outb(iobase + rsa_ier, 0x04); -#endif - - /* - * On some 16x50 incompatibles, setting IER_ETXRDY doesn't generate - * an interrupt. They'd better generate one for actually doing - * output. Loopback may be broken on the same incompatibles but - * it's unlikely to do more than allow the null byte out. - */ - sio_setreg(com, com_data, 0); - if (iobase == siocniobase) - DELAY((1 + 2) * 1000000 / (comdefaultrate / 10)); - else - DELAY((1 + 2) * 1000000 / (SIO_TEST_SPEED / 10)); - - /* - * Turn off loopback mode so that the interrupt gate works again - * (MCR_IENABLE was hidden). This should leave the device driving - * an interrupt line high. It doesn't matter if the interrupt - * line oscillates while we are not looking at it, since interrupts - * are disabled. - */ -/* EXTRA DELAY? */ - sio_setreg(com, com_mcr, mcr_image); - - /* - * It seems my Xircom CBEM56G Cardbus modem wants to be reset - * to 8 bits *again*, or else probe test 0 will fail. - * gwk@sgi.com, 4/19/2001 - */ - sio_setreg(com, com_cfcr, CFCR_8BITS); - - /* - * Some PCMCIA cards (Palido 321s, DC-1S, ...) have the "TXRDY bug", - * so we probe for a buggy IIR_TXRDY implementation even in the - * noprobe case. We don't probe for it in the !noprobe case because - * noprobe is always set for PCMCIA cards and the problem is not - * known to affect any other cards. - */ - if (noprobe) { - /* Read IIR a few times. */ - for (fn = 0; fn < 2; fn ++) { - DELAY(10000); - failures[6] = sio_getreg(com, com_iir); - } - - /* IIR_TXRDY should be clear. Is it? */ - result = 0; - if (failures[6] & IIR_TXRDY) { - /* - * No. We seem to have the bug. Does our fix for - * it work? - */ - sio_setreg(com, com_ier, 0); - if (sio_getreg(com, com_iir) & IIR_NOPEND) { - /* Yes. We discovered the TXRDY bug! */ - SET_FLAG(dev, COM_C_IIR_TXRDYBUG); - } else { - /* No. Just fail. XXX */ - result = ENXIO; - sio_setreg(com, com_mcr, 0); - } - } else { - /* Yes. No bug. */ - CLR_FLAG(dev, COM_C_IIR_TXRDYBUG); - } - sio_setreg(com, com_ier, 0); - sio_setreg(com, com_cfcr, CFCR_8BITS); - mtx_unlock_spin(&sio_lock); - bus_release_resource(dev, SYS_RES_IOPORT, rid, port); - if (iobase == siocniobase) - result = 0; - if (result != 0) { - device_set_softc(dev, NULL); - free(com, M_DEVBUF); - } - return (result); - } - - /* - * Check that - * o the CFCR, IER and MCR in UART hold the values written to them - * (the values happen to be all distinct - this is good for - * avoiding false positive tests from bus echoes). - * o an output interrupt is generated and its vector is correct. - * o the interrupt goes away when the IIR in the UART is read. - */ -/* EXTRA DELAY? */ - failures[0] = sio_getreg(com, com_cfcr) - CFCR_8BITS; - failures[1] = sio_getreg(com, com_ier) - IER_ETXRDY; - failures[2] = sio_getreg(com, com_mcr) - mcr_image; - DELAY(10000); /* Some internal modems need this time */ - irqmap[1] = isa_irq_pending(); - failures[4] = (sio_getreg(com, com_iir) & IIR_IMASK) - IIR_TXRDY; -#ifdef PC98 - if (iod.if_type == COM_IF_RSA98III) - inb(iobase + rsa_srr); -#endif - DELAY(1000); /* XXX */ - irqmap[2] = isa_irq_pending(); - failures[6] = (sio_getreg(com, com_iir) & IIR_IMASK) - IIR_NOPEND; -#ifdef PC98 - if (iod.if_type == COM_IF_RSA98III) - inb(iobase + rsa_srr); -#endif - - /* - * Turn off all device interrupts and check that they go off properly. - * Leave MCR_IENABLE alone. For ports without a master port, it gates - * the OUT2 output of the UART to - * the ICU input. Closing the gate would give a floating ICU input - * (unless there is another device driving it) and spurious interrupts. - * (On the system that this was first tested on, the input floats high - * and gives a (masked) interrupt as soon as the gate is closed.) - */ - sio_setreg(com, com_ier, 0); - sio_setreg(com, com_cfcr, CFCR_8BITS); /* dummy to avoid bus echo */ - failures[7] = sio_getreg(com, com_ier); -#ifdef PC98 - if (iod.if_type == COM_IF_RSA98III) - outb(iobase + rsa_ier, 0x00); -#endif - DELAY(1000); /* XXX */ - irqmap[3] = isa_irq_pending(); - failures[9] = (sio_getreg(com, com_iir) & IIR_IMASK) - IIR_NOPEND; -#ifdef PC98 - if (iod.if_type == COM_IF_RSA98III) { - inb(iobase + rsa_srr); - outb(iobase + rsa_frr, 0x00); - } -#endif - - mtx_unlock_spin(&sio_lock); - - irqs = irqmap[1] & ~irqmap[0]; - if (bus_get_resource(idev, SYS_RES_IRQ, 0, &xirq, NULL) == 0 && - ((1 << xirq) & irqs) == 0) { - printf( - "sio%d: configured irq %ld not in bitmap of probed irqs %#x\n", - device_get_unit(dev), xirq, irqs); - printf( - "sio%d: port may not be enabled\n", - device_get_unit(dev)); - } - if (bootverbose) - printf("sio%d: irq maps: %#x %#x %#x %#x\n", - device_get_unit(dev), - irqmap[0], irqmap[1], irqmap[2], irqmap[3]); - - result = 0; - for (fn = 0; fn < sizeof failures; ++fn) - if (failures[fn]) { - sio_setreg(com, com_mcr, 0); - result = ENXIO; - if (bootverbose) { - printf("sio%d: probe failed test(s):", - device_get_unit(dev)); - for (fn = 0; fn < sizeof failures; ++fn) - if (failures[fn]) - printf(" %d", fn); - printf("\n"); - } - break; - } - bus_release_resource(dev, SYS_RES_IOPORT, rid, port); - if (iobase == siocniobase) - result = 0; - if (result != 0) { - device_set_softc(dev, NULL); - free(com, M_DEVBUF); - } - return (result); -} - -#ifdef COM_ESP -static int -espattach(com, esp_port) - struct com_s *com; - Port_t esp_port; -{ - u_char dips; - u_char val; - - /* - * Check the ESP-specific I/O port to see if we're an ESP - * card. If not, return failure immediately. - */ - if ((inb(esp_port) & 0xf3) == 0) { - printf(" port 0x%x is not an ESP board?\n", esp_port); - return (0); - } - - /* - * We've got something that claims to be a Hayes ESP card. - * Let's hope so. - */ - - /* Get the dip-switch configuration */ -#ifdef PC98 - outb(esp_port + ESP98_CMD1, ESP_GETDIPS); - dips = inb(esp_port + ESP98_STATUS1); -#else - outb(esp_port + ESP_CMD1, ESP_GETDIPS); - dips = inb(esp_port + ESP_STATUS1); -#endif - - /* - * Bits 0,1 of dips say which COM port we are. - */ -#ifdef PC98 - if ((rman_get_start(com->ioportres) & 0xff) == - likely_com_ports[dips & 0x03]) -#else - if (rman_get_start(com->ioportres) == likely_com_ports[dips & 0x03]) -#endif - printf(" : ESP"); - else { - printf(" esp_port has com %d\n", dips & 0x03); - return (0); - } - - /* - * Check for ESP version 2.0 or later: bits 4,5,6 = 010. - */ -#ifdef PC98 - outb(esp_port + ESP98_CMD1, ESP_GETTEST); - val = inb(esp_port + ESP98_STATUS1); /* clear reg 1 */ - val = inb(esp_port + ESP98_STATUS2); -#else - outb(esp_port + ESP_CMD1, ESP_GETTEST); - val = inb(esp_port + ESP_STATUS1); /* clear reg 1 */ - val = inb(esp_port + ESP_STATUS2); -#endif - if ((val & 0x70) < 0x20) { - printf("-old (%o)", val & 0x70); - return (0); - } - - /* - * Check for ability to emulate 16550: bit 7 == 1 - */ - if ((dips & 0x80) == 0) { - printf(" slave"); - return (0); - } - - /* - * Okay, we seem to be a Hayes ESP card. Whee. - */ - com->esp = TRUE; - com->esp_port = esp_port; - return (1); -} -#endif /* COM_ESP */ - -int -sioattach(dev, xrid, rclk) - device_t dev; - int xrid; - u_long rclk; -{ - struct com_s *com; -#ifdef COM_ESP - Port_t *espp; -#endif - Port_t iobase; - int unit; - u_int flags; - int rid; - struct resource *port; - int ret; - int error; - struct tty *tp; -#ifdef PC98 - u_char *obuf; - u_long obufsize; - int if_type = GET_IFTYPE(device_get_flags(dev)); -#endif - - rid = xrid; -#ifdef PC98 - if (IS_8251(if_type)) { - port = bus_alloc_resource_any(dev, SYS_RES_IOPORT, &rid, - RF_ACTIVE); - } else if (if_type == COM_IF_MODEM_CARD || - if_type == COM_IF_RSA98III || - isa_get_vendorid(dev)) { - port = bus_alloc_resource_anywhere(dev, SYS_RES_IOPORT, &rid, - if_16550a_type[if_type & 0x0f].iatsz, RF_ACTIVE); - } else { - port = isa_alloc_resourcev(dev, SYS_RES_IOPORT, &rid, - if_16550a_type[if_type & 0x0f].iat, - if_16550a_type[if_type & 0x0f].iatsz, RF_ACTIVE); - } -#else - port = bus_alloc_resource_anywhere(dev, SYS_RES_IOPORT, &rid, - IO_COMSIZE, RF_ACTIVE); -#endif - if (!port) - return (ENXIO); -#ifdef PC98 - if (!IS_8251(if_type)) { - if (isa_load_resourcev(port, - if_16550a_type[if_type & 0x0f].iat, - if_16550a_type[if_type & 0x0f].iatsz) != 0) { - bus_release_resource(dev, SYS_RES_IOPORT, rid, port); - return ENXIO; - } - } -#endif - - iobase = rman_get_start(port); - unit = device_get_unit(dev); - com = device_get_softc(dev); - flags = device_get_flags(dev); - - if (unit >= sio_numunits) - sio_numunits = unit + 1; - -#ifdef PC98 - obufsize = 256; - if (if_type == COM_IF_RSA98III) - obufsize = 2048; - if ((obuf = malloc(obufsize * 2, M_DEVBUF, M_NOWAIT)) == NULL) { - bus_release_resource(dev, SYS_RES_IOPORT, rid, port); - return ENXIO; - } - bzero(obuf, obufsize * 2); -#endif - - /* - * sioprobe() has initialized the device registers as follows: - * o cfcr = CFCR_8BITS. - * It is most important that CFCR_DLAB is off, so that the - * data port is not hidden when we enable interrupts. - * o ier = 0. - * Interrupts are only enabled when the line is open. - * o mcr = MCR_IENABLE, or 0 if the port has AST/4 compatible - * interrupt control register or the config specifies no irq. - * Keeping MCR_DTR and MCR_RTS off might stop the external - * device from sending before we are ready. - */ - bzero(com, sizeof *com); - com->unit = unit; - com->ioportres = port; - com->ioportrid = rid; - com->bst = rman_get_bustag(port); - com->bsh = rman_get_bushandle(port); - com->cfcr_image = CFCR_8BITS; - com->loses_outints = COM_LOSESOUTINTS(flags) != 0; - com->no_irq = bus_get_resource(dev, SYS_RES_IRQ, 0, NULL, NULL) != 0; - com->tx_fifo_size = 1; -#ifdef PC98 - com->obufsize = obufsize; - com->obuf1 = obuf; - com->obuf2 = obuf + obufsize; -#endif - com->obufs[0].l_head = com->obuf1; - com->obufs[1].l_head = com->obuf2; - -#ifdef PC98 - com->pc98_if_type = if_type; - - if (IS_8251(if_type)) { - pc98_set_ioport(com); - - if (if_type == COM_IF_INTERNAL && pc98_check_8251fifo()) { - com->pc98_8251fifo = 1; - com->pc98_8251fifo_enable = 0; - } - } else { - bus_addr_t *iat = if_16550a_type[if_type & 0x0f].iat; - - com->data_port = iobase + iat[com_data]; - com->int_ctl_port = iobase + iat[com_ier]; - com->int_id_port = iobase + iat[com_iir]; - com->modem_ctl_port = iobase + iat[com_mcr]; - com->mcr_image = inb(com->modem_ctl_port); - com->line_status_port = iobase + iat[com_lsr]; - com->modem_status_port = iobase + iat[com_msr]; - } -#else /* not PC98 */ - com->data_port = iobase + com_data; - com->int_ctl_port = iobase + com_ier; - com->int_id_port = iobase + com_iir; - com->modem_ctl_port = iobase + com_mcr; - com->mcr_image = inb(com->modem_ctl_port); - com->line_status_port = iobase + com_lsr; - com->modem_status_port = iobase + com_msr; -#endif - - tp = com->tp = ttyalloc(); - tp->t_oproc = comstart; - tp->t_param = comparam; - tp->t_stop = comstop; - tp->t_modem = commodem; - tp->t_break = combreak; - tp->t_close = comclose; - tp->t_open = comopen; - tp->t_sc = com; - -#ifdef PC98 - if (!IS_8251(if_type) && rclk == 0) - rclk = if_16550a_type[if_type & 0x0f].rclk; -#else - if (rclk == 0) - rclk = DEFAULT_RCLK; -#endif - com->rclk = rclk; - - if (unit == comconsole) - ttyconsolemode(tp, comdefaultrate); - error = siosetwater(com, tp->t_init_in.c_ispeed); - mtx_unlock_spin(&sio_lock); - if (error) { - /* - * Leave i/o resources allocated if this is a `cn'-level - * console, so that other devices can't snarf them. - */ - if (iobase != siocniobase) - bus_release_resource(dev, SYS_RES_IOPORT, rid, port); - return (ENOMEM); - } - - /* attempt to determine UART type */ - printf("sio%d: type", unit); - -#ifndef PC98 - if (!COM_ISMULTIPORT(flags) && - !COM_IIR_TXRDYBUG(flags) && !COM_NOSCR(flags)) { - u_char scr; - u_char scr1; - u_char scr2; - - scr = sio_getreg(com, com_scr); - sio_setreg(com, com_scr, 0xa5); - scr1 = sio_getreg(com, com_scr); - sio_setreg(com, com_scr, 0x5a); - scr2 = sio_getreg(com, com_scr); - sio_setreg(com, com_scr, scr); - if (scr1 != 0xa5 || scr2 != 0x5a) { - printf(" 8250 or not responding"); - goto determined_type; - } - } -#endif /* !PC98 */ -#ifdef PC98 - if (IS_8251(com->pc98_if_type)) { - if (com->pc98_8251fifo && !COM_NOFIFO(flags)) - com->tx_fifo_size = 16; - com_int_TxRx_disable( com ); - com_cflag_and_speed_set( com, tp->t_init_in.c_cflag, comdefaultrate ); - com_tiocm_bic( com, TIOCM_DTR|TIOCM_RTS|TIOCM_LE ); - com_send_break_off( com ); - - if (com->pc98_if_type == COM_IF_INTERNAL) { - printf(" (internal%s%s)", - com->pc98_8251fifo ? " fifo" : "", - PC98SIO_baud_rate_port(com->pc98_if_type) != -1 ? - " v-fast" : ""); - } else { - printf(" 8251%s", if_8251_type[com->pc98_if_type & 0x0f].name); - } - } else { -#endif /* PC98 */ - sio_setreg(com, com_fifo, FIFO_ENABLE | FIFO_RX_HIGH); - DELAY(100); - switch (inb(com->int_id_port) & IIR_FIFO_MASK) { - case FIFO_RX_LOW: - printf(" 16450"); - break; - case FIFO_RX_MEDL: - printf(" 16450?"); - break; - case FIFO_RX_MEDH: - printf(" 16550?"); - break; - case FIFO_RX_HIGH: - if (COM_NOFIFO(flags)) { - printf(" 16550A fifo disabled"); - break; - } - com->hasfifo = TRUE; -#ifdef PC98 - if (com->pc98_if_type == COM_IF_RSA98III) { - com->tx_fifo_size = 2048; - com->rsabase = iobase; - outb(com->rsabase + rsa_ier, 0x00); - outb(com->rsabase + rsa_frr, 0x00); - } -#else - if (COM_ST16650A(flags)) { - printf(" ST16650A"); - com->st16650a = TRUE; - com->tx_fifo_size = 32; - break; - } - if (COM_TI16754(flags)) { - printf(" TI16754"); - com->tx_fifo_size = 64; - break; - } -#endif - printf(" 16550A"); -#ifdef COM_ESP -#ifdef PC98 - if (com->pc98_if_type == COM_IF_ESP98) -#endif - for (espp = likely_esp_ports; *espp != 0; espp++) - if (espattach(com, *espp)) { - com->tx_fifo_size = 1024; - break; - } - if (com->esp) - break; -#endif -#ifdef PC98 - com->tx_fifo_size = 16; -#else - com->tx_fifo_size = COM_FIFOSIZE(flags); - if (com->tx_fifo_size == 0) - com->tx_fifo_size = 16; - else - printf(" lookalike with %u bytes FIFO", - com->tx_fifo_size); -#endif - break; - } - -#ifdef PC98 - if (com->pc98_if_type == COM_IF_RSB3000) { - /* Set RSB-2000/3000 Extended Buffer mode. */ - u_char lcr; - lcr = sio_getreg(com, com_cfcr); - sio_setreg(com, com_cfcr, lcr | CFCR_DLAB); - sio_setreg(com, com_emr, EMR_EXBUFF | EMR_EFMODE); - sio_setreg(com, com_cfcr, lcr); - } -#endif - -#ifdef COM_ESP - if (com->esp) { - /* - * Set 16550 compatibility mode. - * We don't use the ESP_MODE_SCALE bit to increase the - * fifo trigger levels because we can't handle large - * bursts of input. - * XXX flow control should be set in comparam(), not here. - */ -#ifdef PC98 - outb(com->esp_port + ESP98_CMD1, ESP_SETMODE); - outb(com->esp_port + ESP98_CMD2, ESP_MODE_RTS | ESP_MODE_FIFO); -#else - outb(com->esp_port + ESP_CMD1, ESP_SETMODE); - outb(com->esp_port + ESP_CMD2, ESP_MODE_RTS | ESP_MODE_FIFO); -#endif - - /* Set RTS/CTS flow control. */ -#ifdef PC98 - outb(com->esp_port + ESP98_CMD1, ESP_SETFLOWTYPE); - outb(com->esp_port + ESP98_CMD2, ESP_FLOW_RTS); - outb(com->esp_port + ESP98_CMD2, ESP_FLOW_CTS); -#else - outb(com->esp_port + ESP_CMD1, ESP_SETFLOWTYPE); - outb(com->esp_port + ESP_CMD2, ESP_FLOW_RTS); - outb(com->esp_port + ESP_CMD2, ESP_FLOW_CTS); -#endif - - /* Set flow-control levels. */ -#ifdef PC98 - outb(com->esp_port + ESP98_CMD1, ESP_SETRXFLOW); - outb(com->esp_port + ESP98_CMD2, HIBYTE(768)); - outb(com->esp_port + ESP98_CMD2, LOBYTE(768)); - outb(com->esp_port + ESP98_CMD2, HIBYTE(512)); - outb(com->esp_port + ESP98_CMD2, LOBYTE(512)); -#else - outb(com->esp_port + ESP_CMD1, ESP_SETRXFLOW); - outb(com->esp_port + ESP_CMD2, HIBYTE(768)); - outb(com->esp_port + ESP_CMD2, LOBYTE(768)); - outb(com->esp_port + ESP_CMD2, HIBYTE(512)); - outb(com->esp_port + ESP_CMD2, LOBYTE(512)); -#endif - -#ifdef PC98 - /* Set UART clock prescaler. */ - outb(com->esp_port + ESP98_CMD1, ESP_SETCLOCK); - outb(com->esp_port + ESP98_CMD2, 2); /* 4 times */ -#endif - } -#endif /* COM_ESP */ - sio_setreg(com, com_fifo, 0); -#ifdef PC98 - printf("%s", if_16550a_type[com->pc98_if_type & 0x0f].name); -#else -determined_type: ; -#endif - -#ifdef COM_MULTIPORT - if (COM_ISMULTIPORT(flags)) { - device_t masterdev; - - com->multiport = TRUE; - printf(" (multiport"); - if (unit == COM_MPMASTER(flags)) - printf(" master"); - printf(")"); - masterdev = devclass_get_device(sio_devclass, - COM_MPMASTER(flags)); - com->no_irq = (masterdev == NULL || bus_get_resource(masterdev, - SYS_RES_IRQ, 0, NULL, NULL) != 0); - } -#endif /* COM_MULTIPORT */ -#ifdef PC98 - } -#endif - if (unit == comconsole) - printf(", console"); - if (COM_IIR_TXRDYBUG(flags)) - printf(" with a buggy IIR_TXRDY implementation"); - printf("\n"); - - if (sio_fast_ih == NULL) { - swi_add(&tty_intr_event, "sio", siopoll, NULL, SWI_TTY, 0, - &sio_fast_ih); - swi_add(&clk_intr_event, "sio", siopoll, NULL, SWI_CLOCK, 0, - &sio_slow_ih); - } - - com->flags = flags; - com->pps.ppscap = PPS_CAPTUREASSERT | PPS_CAPTURECLEAR; - tp->t_pps = &com->pps; - - if (COM_PPSCTS(flags)) - com->pps_bit = MSR_CTS; - else - com->pps_bit = MSR_DCD; - pps_init(&com->pps); - - rid = 0; - com->irqres = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid, RF_ACTIVE); - if (com->irqres) { - ret = bus_setup_intr(dev, com->irqres, - INTR_TYPE_TTY, - siointr, NULL, com, &com->cookie); - if (ret) { - ret = bus_setup_intr(dev, - com->irqres, INTR_TYPE_TTY, - NULL, (driver_intr_t *)siointr, - com, &com->cookie); - if (ret == 0) - device_printf(dev, "unable to activate interrupt in fast mode - using normal mode\n"); - } - if (ret) - device_printf(dev, "could not activate interrupt\n"); -#if defined(KDB) - /* - * Enable interrupts for early break-to-debugger support - * on the console. - */ - if (ret == 0 && unit == comconsole) - outb(siocniobase + com_ier, IER_ERXRDY | IER_ERLS | - IER_EMSC); -#endif - } - - /* We're ready, open the doors... */ - ttycreate(tp, TS_CALLOUT, "d%r", unit); - - return (0); -} - -static int -comopen(struct tty *tp, struct cdev *dev) -{ - struct com_s *com; - int i; - - com = tp->t_sc; - com->poll = com->no_irq; - com->poll_output = com->loses_outints; -#ifdef PC98 - if (IS_8251(com->pc98_if_type)) { - com_tiocm_bis(com, TIOCM_DTR|TIOCM_RTS); - pc98_msrint_start(dev); - if (com->pc98_8251fifo) { - com->pc98_8251fifo_enable = 1; - outb(I8251F_fcr, - FIFO_ENABLE | FIFO_XMT_RST | FIFO_RCV_RST); - } - } -#endif - if (com->hasfifo) { - /* - * (Re)enable and drain fifos. - * - * Certain SMC chips cause problems if the fifos - * are enabled while input is ready. Turn off the - * fifo if necessary to clear the input. We test - * the input ready bit after enabling the fifos - * since we've already enabled them in comparam() - * and to handle races between enabling and fresh - * input. - */ - for (i = 0; i < 500; i++) { - sio_setreg(com, com_fifo, - FIFO_RCV_RST | FIFO_XMT_RST | com->fifo_image); -#ifdef PC98 - if (com->pc98_if_type == COM_IF_RSA98III) - outb(com->rsabase + rsa_frr , 0x00); -#endif - /* - * XXX the delays are for superstitious - * historical reasons. It must be less than - * the character time at the maximum - * supported speed (87 usec at 115200 bps - * 8N1). Otherwise we might loop endlessly - * if data is streaming in. We used to use - * delays of 100. That usually worked - * because DELAY(100) used to usually delay - * for about 85 usec instead of 100. - */ - DELAY(50); -#ifdef PC98 - if (com->pc98_if_type == COM_IF_RSA98III ? - !(inb(com->rsabase + rsa_srr) & 0x08) : - !(inb(com->line_status_port) & LSR_RXRDY)) - break; -#else - if (!(inb(com->line_status_port) & LSR_RXRDY)) - break; -#endif - sio_setreg(com, com_fifo, 0); - DELAY(50); - (void) inb(com->data_port); - } - if (i == 500) - return (EIO); - } - - mtx_lock_spin(&sio_lock); -#ifdef PC98 - if (IS_8251(com->pc98_if_type)) { - com_tiocm_bis(com, TIOCM_LE); - com->pc98_prev_modem_status = pc98_get_modem_status(com); - com_int_Rx_enable(com); - } else { -#endif - (void) inb(com->line_status_port); - (void) inb(com->data_port); - com->prev_modem_status = com->last_modem_status - = inb(com->modem_status_port); - outb(com->int_ctl_port, - IER_ERXRDY | IER_ERLS | IER_EMSC - | (COM_IIR_TXRDYBUG(com->flags) ? 0 : IER_ETXRDY)); -#ifdef PC98 - if (com->pc98_if_type == COM_IF_RSA98III) { - outb(com->rsabase + rsa_ier, 0x1d); - outb(com->int_ctl_port, IER_ERLS | IER_EMSC); - } -#endif -#ifdef PC98 - } -#endif - mtx_unlock_spin(&sio_lock); - siosettimeout(); - /* XXX: should be generic ? */ -#ifdef PC98 - if ((IS_8251(com->pc98_if_type) && - (pc98_get_modem_status(com) & TIOCM_CAR)) || - (!IS_8251(com->pc98_if_type) && - (com->prev_modem_status & MSR_DCD)) || - ISCALLOUT(dev)) - ttyld_modem(tp, 1); -#else - if (com->prev_modem_status & MSR_DCD || ISCALLOUT(dev)) - ttyld_modem(tp, 1); -#endif - return (0); -} - -static void -comclose(tp) - struct tty *tp; -{ - int s; - struct com_s *com; - - s = spltty(); - com = tp->t_sc; - com->poll = FALSE; - com->poll_output = FALSE; -#ifdef PC98 - com_send_break_off(com); -#else - sio_setreg(com, com_cfcr, com->cfcr_image &= ~CFCR_SBREAK); -#endif - -#if defined(KDB) - /* - * Leave interrupts enabled and don't clear DTR if this is the - * console. This allows us to detect break-to-debugger events - * while the console device is closed. - */ - if (com->unit != comconsole) -#endif - { -#ifdef PC98 - int tmp; - if (IS_8251(com->pc98_if_type)) - com_int_TxRx_disable(com); - else - sio_setreg(com, com_ier, 0); - if (com->pc98_if_type == COM_IF_RSA98III) - outb(com->rsabase + rsa_ier, 0x00); - if (IS_8251(com->pc98_if_type)) - tmp = pc98_get_modem_status(com) & TIOCM_CAR; - else - tmp = com->prev_modem_status & MSR_DCD; -#else - sio_setreg(com, com_ier, 0); -#endif - if (tp->t_cflag & HUPCL - /* - * XXX we will miss any carrier drop between here and the - * next open. Perhaps we should watch DCD even when the - * port is closed; it is not sufficient to check it at - * the next open because it might go up and down while - * we're not watching. - */ - || (!tp->t_actout -#ifdef PC98 - && !(tmp) -#else - && !(com->prev_modem_status & MSR_DCD) -#endif - && !(tp->t_init_in.c_cflag & CLOCAL)) - || !(tp->t_state & TS_ISOPEN)) { -#ifdef PC98 - if (IS_8251(com->pc98_if_type)) - com_tiocm_bic(com, TIOCM_DTR|TIOCM_RTS|TIOCM_LE); - else -#endif - (void)commodem(tp, 0, SER_DTR); - ttydtrwaitstart(tp); - } -#ifdef PC98 - else { - if (IS_8251(com->pc98_if_type)) - com_tiocm_bic(com, TIOCM_LE); - } -#endif - } -#ifdef PC98 - if (com->pc98_8251fifo) { - if (com->pc98_8251fifo_enable) - outb(I8251F_fcr, FIFO_XMT_RST | FIFO_RCV_RST); - com->pc98_8251fifo_enable = 0; - } -#endif - if (com->hasfifo) { - /* - * Disable fifos so that they are off after controlled - * reboots. Some BIOSes fail to detect 16550s when the - * fifos are enabled. - */ - sio_setreg(com, com_fifo, 0); - } - tp->t_actout = FALSE; - wakeup(&tp->t_actout); - wakeup(TSA_CARR_ON(tp)); /* restart any wopeners */ - siosettimeout(); - splx(s); -} - -static void -siobusycheck(chan) - void *chan; -{ - struct com_s *com; - int s; - - com = (struct com_s *)chan; - - /* - * Clear TS_BUSY if low-level output is complete. - * spl locking is sufficient because siointr1() does not set CS_BUSY. - * If siointr1() clears CS_BUSY after we look at it, then we'll get - * called again. Reading the line status port outside of siointr1() - * is safe because CS_BUSY is clear so there are no output interrupts - * to lose. - */ - s = spltty(); - if (com->state & CS_BUSY) - com->extra_state &= ~CSE_BUSYCHECK; /* False alarm. */ -#ifdef PC98 - else if ((IS_8251(com->pc98_if_type) && - ((com->pc98_8251fifo_enable && - (inb(I8251F_lsr) & (FLSR_TxRDY | FLSR_TxEMP)) - == (FLSR_TxRDY | FLSR_TxEMP)) || - (!com->pc98_8251fifo_enable && - (inb(com->sts_port) & (STS8251_TxRDY | STS8251_TxEMP)) - == (STS8251_TxRDY | STS8251_TxEMP)))) || - ((inb(com->line_status_port) & (LSR_TSRE | LSR_TXRDY)) - == (LSR_TSRE | LSR_TXRDY))) { -#else - else if ((inb(com->line_status_port) & (LSR_TSRE | LSR_TXRDY)) - == (LSR_TSRE | LSR_TXRDY)) { -#endif - com->tp->t_state &= ~TS_BUSY; - ttwwakeup(com->tp); - com->extra_state &= ~CSE_BUSYCHECK; - } else - timeout(siobusycheck, com, hz / 100); - splx(s); -} - -static u_int -siodivisor(rclk, speed) - u_long rclk; - speed_t speed; -{ - long actual_speed; - u_int divisor; - int error; - - if (speed == 0) - return (0); -#if UINT_MAX > (ULONG_MAX - 1) / 8 - if (speed > (ULONG_MAX - 1) / 8) - return (0); -#endif - divisor = (rclk / (8UL * speed) + 1) / 2; - if (divisor == 0 || divisor >= 65536) - return (0); - actual_speed = rclk / (16UL * divisor); - - /* 10 times error in percent: */ - error = ((actual_speed - (long)speed) * 2000 / (long)speed + 1) / 2; - - /* 3.0% maximum error tolerance: */ - if (error < -30 || error > 30) - return (0); - - return (divisor); -} - -/* - * Call this function with the sio_lock mutex held. It will return with the - * lock still held. - */ -static void -sioinput(com) - struct com_s *com; -{ - u_char *buf; - int incc; - u_char line_status; - int recv_data; - struct tty *tp; - - buf = com->ibuf; - tp = com->tp; - if (!(tp->t_state & TS_ISOPEN) || !(tp->t_cflag & CREAD)) { - com_events -= (com->iptr - com->ibuf); - com->iptr = com->ibuf; - return; - } - if (tp->t_state & TS_CAN_BYPASS_L_RINT) { - /* - * Avoid the grotesquely inefficient lineswitch routine - * (ttyinput) in "raw" mode. It usually takes about 450 - * instructions (that's without canonical processing or echo!). - * slinput is reasonably fast (usually 40 instructions plus - * call overhead). - */ - do { - /* - * This may look odd, but it is using save-and-enable - * semantics instead of the save-and-disable semantics - * that are used everywhere else. - */ - mtx_unlock_spin(&sio_lock); - incc = com->iptr - buf; - if (tp->t_rawq.c_cc + incc > tp->t_ihiwat - && (com->state & CS_RTS_IFLOW - || tp->t_iflag & IXOFF) - && !(tp->t_state & TS_TBLOCK)) - ttyblock(tp); - com->delta_error_counts[CE_TTY_BUF_OVERFLOW] - += b_to_q((char *)buf, incc, &tp->t_rawq); - buf += incc; - tk_nin += incc; - tk_rawcc += incc; - tp->t_rawcc += incc; - ttwakeup(tp); - if (tp->t_state & TS_TTSTOP - && (tp->t_iflag & IXANY - || tp->t_cc[VSTART] == tp->t_cc[VSTOP])) { - tp->t_state &= ~TS_TTSTOP; - tp->t_lflag &= ~FLUSHO; - comstart(tp); - } - mtx_lock_spin(&sio_lock); - } while (buf < com->iptr); - } else { - do { - /* - * This may look odd, but it is using save-and-enable - * semantics instead of the save-and-disable semantics - * that are used everywhere else. - */ - mtx_unlock_spin(&sio_lock); - line_status = buf[com->ierroff]; - recv_data = *buf++; - if (line_status - & (LSR_BI | LSR_FE | LSR_OE | LSR_PE)) { - if (line_status & LSR_BI) - recv_data |= TTY_BI; - if (line_status & LSR_FE) - recv_data |= TTY_FE; - if (line_status & LSR_OE) - recv_data |= TTY_OE; - if (line_status & LSR_PE) - recv_data |= TTY_PE; - } - ttyld_rint(tp, recv_data); - mtx_lock_spin(&sio_lock); - } while (buf < com->iptr); - } - com_events -= (com->iptr - com->ibuf); - com->iptr = com->ibuf; - - /* - * There is now room for another low-level buffer full of input, - * so enable RTS if it is now disabled and there is room in the - * high-level buffer. - */ -#ifdef PC98 - if (IS_8251(com->pc98_if_type)) { - if ((com->state & CS_RTS_IFLOW) && - !(com_tiocm_get(com) & TIOCM_RTS) && - !(tp->t_state & TS_TBLOCK)) - com_tiocm_bis(com, TIOCM_RTS); - } else { - if ((com->state & CS_RTS_IFLOW) && - !(com->mcr_image & MCR_RTS) && - !(tp->t_state & TS_TBLOCK)) - outb(com->modem_ctl_port, com->mcr_image |= MCR_RTS); - } -#else - if ((com->state & CS_RTS_IFLOW) && !(com->mcr_image & MCR_RTS) && - !(tp->t_state & TS_TBLOCK)) - outb(com->modem_ctl_port, com->mcr_image |= MCR_RTS); -#endif -} - -static int -siointr(arg) - void *arg; -{ - struct com_s *com; -#if defined(PC98) && defined(COM_MULTIPORT) - u_char rsa_buf_status; -#endif - -#ifndef COM_MULTIPORT - com = (struct com_s *)arg; - - mtx_lock_spin(&sio_lock); - siointr1(com); - mtx_unlock_spin(&sio_lock); -#else /* COM_MULTIPORT */ - bool_t possibly_more_intrs; - int unit; - - /* - * Loop until there is no activity on any port. This is necessary - * to get an interrupt edge more than to avoid another interrupt. - * If the IRQ signal is just an OR of the IRQ signals from several - * devices, then the edge from one may be lost because another is - * on. - */ - mtx_lock_spin(&sio_lock); - do { - possibly_more_intrs = FALSE; - for (unit = 0; unit < sio_numunits; ++unit) { - com = com_addr(unit); - /* - * XXX COM_LOCK(); - * would it work here, or be counter-productive? - */ -#ifdef PC98 - if (com != NULL - && !com->gone - && IS_8251(com->pc98_if_type)) { - siointr1(com); - } else if (com != NULL - && !com->gone - && com->pc98_if_type == COM_IF_RSA98III) { - rsa_buf_status = - inb(com->rsabase + rsa_srr) & 0xc9; - if ((rsa_buf_status & 0xc8) - || !(rsa_buf_status & 0x01)) { - siointr1(com); - if (rsa_buf_status != - (inb(com->rsabase + rsa_srr) & 0xc9)) - possibly_more_intrs = TRUE; - } - } else -#endif - if (com != NULL - && !com->gone - && (inb(com->int_id_port) & IIR_IMASK) - != IIR_NOPEND) { - siointr1(com); - possibly_more_intrs = TRUE; - } - /* XXX COM_UNLOCK(); */ - } - } while (possibly_more_intrs); - mtx_unlock_spin(&sio_lock); -#endif /* COM_MULTIPORT */ - return (FILTER_HANDLED); -} - -static struct timespec siots[8]; -static int siotso; -static int volatile siotsunit = -1; - -static int -sysctl_siots(SYSCTL_HANDLER_ARGS) -{ - char buf[128]; - long long delta; - size_t len; - int error, i, tso; - - for (i = 1, tso = siotso; i < tso; i++) { - delta = (long long)(siots[i].tv_sec - siots[i - 1].tv_sec) * - 1000000000 + - (siots[i].tv_nsec - siots[i - 1].tv_nsec); - len = sprintf(buf, "%lld\n", delta); - if (delta >= 110000) - len += sprintf(buf + len - 1, ": *** %ld.%09ld\n", - (long)siots[i].tv_sec, siots[i].tv_nsec) - 1; - if (i == tso - 1) - buf[len - 1] = '\0'; - error = SYSCTL_OUT(req, buf, len); - if (error != 0) - return (error); - } - return (0); -} - -SYSCTL_PROC(_machdep, OID_AUTO, siots, CTLTYPE_STRING | CTLFLAG_RD, - 0, 0, sysctl_siots, "A", "sio timestamps"); - -static void -siointr1(com) - struct com_s *com; -{ - u_char int_ctl; - u_char int_ctl_new; - u_char line_status; - u_char modem_status; - u_char *ioptr; - u_char recv_data; -#ifdef PC98 - u_char tmp = 0; - u_char rsa_buf_status = 0; - int rsa_tx_fifo_size = 0; -#endif /* PC98 */ -#if defined(KDB) - int kdb_brk; - -again: -#endif - - if (COM_IIR_TXRDYBUG(com->flags)) { - int_ctl = inb(com->int_ctl_port); - int_ctl_new = int_ctl; - } else { - int_ctl = 0; - int_ctl_new = 0; - } - - while (!com->gone) { -#ifdef PC98 -status_read:; - if (IS_8251(com->pc98_if_type)) { - if (com->pc98_8251fifo_enable) - tmp = inb(I8251F_lsr); - else - tmp = inb(com->sts_port); -more_intr: - line_status = 0; - if (com->pc98_8251fifo_enable) { - if (tmp & FLSR_TxRDY) line_status |= LSR_TXRDY; - if (tmp & FLSR_RxRDY) line_status |= LSR_RXRDY; - if (tmp & FLSR_TxEMP) line_status |= LSR_TSRE; - if (tmp & FLSR_PE) line_status |= LSR_PE; - if (tmp & FLSR_OE) line_status |= LSR_OE; - if (tmp & FLSR_BI) line_status |= LSR_BI; - } else { - if (tmp & STS8251_TxRDY) line_status |= LSR_TXRDY; - if (tmp & STS8251_RxRDY) line_status |= LSR_RXRDY; - if (tmp & STS8251_TxEMP) line_status |= LSR_TSRE; - if (tmp & STS8251_PE) line_status |= LSR_PE; - if (tmp & STS8251_OE) line_status |= LSR_OE; - if (tmp & STS8251_FE) line_status |= LSR_FE; - if (tmp & STS8251_BI) line_status |= LSR_BI; - } - } else { -#endif /* PC98 */ - if (com->pps.ppsparam.mode & PPS_CAPTUREBOTH) { - modem_status = inb(com->modem_status_port); - if ((modem_status ^ com->last_modem_status) & - com->pps_bit) { - pps_capture(&com->pps); - pps_event(&com->pps, - (modem_status & com->pps_bit) ? - PPS_CAPTUREASSERT : PPS_CAPTURECLEAR); - } - } - line_status = inb(com->line_status_port); -#ifdef PC98 - } - if (com->pc98_if_type == COM_IF_RSA98III) - rsa_buf_status = inb(com->rsabase + rsa_srr); -#endif /* PC98 */ - - /* input event? (check first to help avoid overruns) */ -#ifndef PC98 - while (line_status & LSR_RCV_MASK) { -#else - while ((line_status & LSR_RCV_MASK) - || (com->pc98_if_type == COM_IF_RSA98III - && (rsa_buf_status & 0x08))) { -#endif /* PC98 */ - /* break/unnattached error bits or real input? */ -#ifdef PC98 - if (IS_8251(com->pc98_if_type)) { - if (com->pc98_8251fifo_enable) { - recv_data = inb(I8251F_data); - if (tmp & - (FLSR_PE | FLSR_OE | FLSR_BI)) { - pc98_i8251_or_cmd(com, CMD8251_ER); - recv_data = 0; - } - } else { - recv_data = inb(com->data_port); - if (tmp & (STS8251_PE | STS8251_OE | - STS8251_FE | STS8251_BI)) { - pc98_i8251_or_cmd(com, CMD8251_ER); - recv_data = 0; - } - } - } else if (com->pc98_if_type == COM_IF_RSA98III) { - if (!(rsa_buf_status & 0x08)) - recv_data = 0; - else - recv_data = inb(com->data_port); - } else -#endif - if (!(line_status & LSR_RXRDY)) - recv_data = 0; - else - recv_data = inb(com->data_port); -#ifdef KDB - if (com->unit == comconsole && - (kdb_brk = kdb_alt_break(recv_data, - &com->alt_brk_state)) != 0) { - goto again; - } -#endif /* KDB */ - if (line_status & (LSR_BI | LSR_FE | LSR_PE)) { - /* - * Don't store BI if IGNBRK or FE/PE if IGNPAR. - * Otherwise, push the work to a higher level - * (to handle PARMRK) if we're bypassing. - * Otherwise, convert BI/FE and PE+INPCK to 0. - * - * This makes bypassing work right in the - * usual "raw" case (IGNBRK set, and IGNPAR - * and INPCK clear). - * - * Note: BI together with FE/PE means just BI. - */ - if (line_status & LSR_BI) { -#if defined(KDB) - if (com->unit == comconsole) { - kdb_enter(KDB_WHY_BREAK, - "Line break on console"); - goto cont; - } -#endif - if (com->tp == NULL - || com->tp->t_iflag & IGNBRK) - goto cont; - } else { - if (com->tp == NULL - || com->tp->t_iflag & IGNPAR) - goto cont; - } - if (com->tp->t_state & TS_CAN_BYPASS_L_RINT - && (line_status & (LSR_BI | LSR_FE) - || com->tp->t_iflag & INPCK)) - recv_data = 0; - } - ++com->bytes_in; - if (com->tp != NULL && - com->tp->t_hotchar != 0 && recv_data == com->tp->t_hotchar) - swi_sched(sio_fast_ih, 0); - ioptr = com->iptr; - if (ioptr >= com->ibufend) - CE_RECORD(com, CE_INTERRUPT_BUF_OVERFLOW); - else { - if (com->tp != NULL && com->tp->t_do_timestamp) - microtime(&com->tp->t_timestamp); - ++com_events; - swi_sched(sio_slow_ih, SWI_DELAY); -#if 0 /* for testing input latency vs efficiency */ -if (com->iptr - com->ibuf == 8) - swi_sched(sio_fast_ih, 0); -#endif - ioptr[0] = recv_data; - ioptr[com->ierroff] = line_status; - com->iptr = ++ioptr; - if (ioptr == com->ihighwater - && com->state & CS_RTS_IFLOW) -#ifdef PC98 - IS_8251(com->pc98_if_type) ? - com_tiocm_bic(com, TIOCM_RTS) : -#endif - outb(com->modem_ctl_port, - com->mcr_image &= ~MCR_RTS); - if (line_status & LSR_OE) - CE_RECORD(com, CE_OVERRUN); - } -cont: - if (line_status & LSR_TXRDY - && com->state >= (CS_BUSY | CS_TTGO | CS_ODEVREADY)) - goto txrdy; - - /* - * "& 0x7F" is to avoid the gcc-1.40 generating a slow - * jump from the top of the loop to here - */ -#ifdef PC98 - if (IS_8251(com->pc98_if_type)) - goto status_read; - else -#endif - line_status = inb(com->line_status_port) & 0x7F; -#ifdef PC98 - if (com->pc98_if_type == COM_IF_RSA98III) - rsa_buf_status = inb(com->rsabase + rsa_srr); -#endif /* PC98 */ - } - - /* modem status change? (always check before doing output) */ -#ifdef PC98 - if (!IS_8251(com->pc98_if_type)) { -#endif - modem_status = inb(com->modem_status_port); - if (modem_status != com->last_modem_status) { - /* - * Schedule high level to handle DCD changes. Note - * that we don't use the delta bits anywhere. Some - * UARTs mess them up, and it's easy to remember the - * previous bits and calculate the delta. - */ - com->last_modem_status = modem_status; - if (!(com->state & CS_CHECKMSR)) { - com_events += LOTS_OF_EVENTS; - com->state |= CS_CHECKMSR; - swi_sched(sio_fast_ih, 0); - } - - /* handle CTS change immediately for crisp flow ctl */ - if (com->state & CS_CTS_OFLOW) { - if (modem_status & MSR_CTS) - com->state |= CS_ODEVREADY; - else - com->state &= ~CS_ODEVREADY; - } - } -#ifdef PC98 - } -#endif - -txrdy: - /* output queued and everything ready? */ -#ifndef PC98 - if (line_status & LSR_TXRDY - && com->state >= (CS_BUSY | CS_TTGO | CS_ODEVREADY)) { -#else - if (((com->pc98_if_type == COM_IF_RSA98III) - ? (rsa_buf_status & 0x02) - : (line_status & LSR_TXRDY)) - && com->state >= (CS_BUSY | CS_TTGO | CS_ODEVREADY)) { -#endif -#ifdef PC98 - Port_t tmp_data_port; - - if (IS_8251(com->pc98_if_type) && - com->pc98_8251fifo_enable) - tmp_data_port = I8251F_data; - else - tmp_data_port = com->data_port; -#endif - - ioptr = com->obufq.l_head; - if (com->tx_fifo_size > 1 && com->unit != siotsunit) { - u_int ocount; - - ocount = com->obufq.l_tail - ioptr; -#ifdef PC98 - if (com->pc98_if_type == COM_IF_RSA98III) { - rsa_buf_status = inb(com->rsabase + rsa_srr); - rsa_tx_fifo_size = 1024; - if (!(rsa_buf_status & 0x01)) - rsa_tx_fifo_size = 2048; - if (ocount > rsa_tx_fifo_size) - ocount = rsa_tx_fifo_size; - } else -#endif - if (ocount > com->tx_fifo_size) - ocount = com->tx_fifo_size; - com->bytes_out += ocount; - do -#ifdef PC98 - outb(tmp_data_port, *ioptr++); -#else - outb(com->data_port, *ioptr++); -#endif - while (--ocount != 0); - } else { -#ifdef PC98 - outb(tmp_data_port, *ioptr++); -#else - outb(com->data_port, *ioptr++); -#endif - ++com->bytes_out; - if (com->unit == siotsunit - && siotso < sizeof siots / sizeof siots[0]) - nanouptime(&siots[siotso++]); - } -#ifdef PC98 - if (IS_8251(com->pc98_if_type)) - if (!(pc98_check_i8251_interrupt(com) & IEN_TxFLAG)) - com_int_Tx_enable(com); -#endif - com->obufq.l_head = ioptr; - if (COM_IIR_TXRDYBUG(com->flags)) - int_ctl_new = int_ctl | IER_ETXRDY; - if (ioptr >= com->obufq.l_tail) { - struct lbq *qp; - - qp = com->obufq.l_next; - qp->l_queued = FALSE; - qp = qp->l_next; - if (qp != NULL) { - com->obufq.l_head = qp->l_head; - com->obufq.l_tail = qp->l_tail; - com->obufq.l_next = qp; - } else { - /* output just completed */ - if (COM_IIR_TXRDYBUG(com->flags)) - int_ctl_new = int_ctl - & ~IER_ETXRDY; - com->state &= ~CS_BUSY; -#if defined(PC98) - if (IS_8251(com->pc98_if_type) && - pc98_check_i8251_interrupt(com) & IEN_TxFLAG) - com_int_Tx_disable(com); -#endif - } - if (!(com->state & CS_ODONE)) { - com_events += LOTS_OF_EVENTS; - com->state |= CS_ODONE; - /* handle at high level ASAP */ - swi_sched(sio_fast_ih, 0); - } - } -#ifdef PC98 - if (COM_IIR_TXRDYBUG(com->flags) - && int_ctl != int_ctl_new) { - if (com->pc98_if_type == COM_IF_RSA98III) { - int_ctl_new &= ~(IER_ETXRDY | IER_ERXRDY); - outb(com->int_ctl_port, int_ctl_new); - outb(com->rsabase + rsa_ier, 0x1d); - } else - outb(com->int_ctl_port, int_ctl_new); - } -#else - if (COM_IIR_TXRDYBUG(com->flags) - && int_ctl != int_ctl_new) - outb(com->int_ctl_port, int_ctl_new); -#endif - } -#ifdef PC98 - else if (line_status & LSR_TXRDY) { - if (IS_8251(com->pc98_if_type)) - if (pc98_check_i8251_interrupt(com) & IEN_TxFLAG) - com_int_Tx_disable(com); - } - if (IS_8251(com->pc98_if_type)) { - if (com->pc98_8251fifo_enable) { - if ((tmp = inb(I8251F_lsr)) & FLSR_RxRDY) - goto more_intr; - } else { - if ((tmp = inb(com->sts_port)) & STS8251_RxRDY) - goto more_intr; - } - } -#endif - - /* finished? */ -#ifndef COM_MULTIPORT -#ifdef PC98 - if (IS_8251(com->pc98_if_type)) - return; -#endif - if ((inb(com->int_id_port) & IIR_IMASK) == IIR_NOPEND) -#endif /* COM_MULTIPORT */ - return; - } -} - -/* software interrupt handler for SWI_TTY */ -static void -siopoll(void *dummy) -{ - int unit; - - if (com_events == 0) - return; -repeat: - for (unit = 0; unit < sio_numunits; ++unit) { - struct com_s *com; - int incc; - struct tty *tp; - - com = com_addr(unit); - if (com == NULL) - continue; - tp = com->tp; - if (tp == NULL || com->gone) { - /* - * Discard any events related to never-opened or - * going-away devices. - */ - mtx_lock_spin(&sio_lock); - incc = com->iptr - com->ibuf; - com->iptr = com->ibuf; - if (com->state & CS_CHECKMSR) { - incc += LOTS_OF_EVENTS; - com->state &= ~CS_CHECKMSR; - } - com_events -= incc; - mtx_unlock_spin(&sio_lock); - continue; - } - if (com->iptr != com->ibuf) { - mtx_lock_spin(&sio_lock); - sioinput(com); - mtx_unlock_spin(&sio_lock); - } - if (com->state & CS_CHECKMSR) { - u_char delta_modem_status; - -#ifdef PC98 - if (!IS_8251(com->pc98_if_type)) { -#endif - mtx_lock_spin(&sio_lock); - delta_modem_status = com->last_modem_status - ^ com->prev_modem_status; - com->prev_modem_status = com->last_modem_status; - com_events -= LOTS_OF_EVENTS; - com->state &= ~CS_CHECKMSR; - mtx_unlock_spin(&sio_lock); - if (delta_modem_status & MSR_DCD) - ttyld_modem(tp, - com->prev_modem_status & MSR_DCD); -#ifdef PC98 - } -#endif - } - if (com->state & CS_ODONE) { - mtx_lock_spin(&sio_lock); - com_events -= LOTS_OF_EVENTS; - com->state &= ~CS_ODONE; - mtx_unlock_spin(&sio_lock); - if (!(com->state & CS_BUSY) - && !(com->extra_state & CSE_BUSYCHECK)) { - timeout(siobusycheck, com, hz / 100); - com->extra_state |= CSE_BUSYCHECK; - } - ttyld_start(tp); - } - if (com_events == 0) - break; - } - if (com_events >= LOTS_OF_EVENTS) - goto repeat; -} - -static void -combreak(tp, sig) - struct tty *tp; - int sig; -{ - struct com_s *com; - - com = tp->t_sc; - -#ifdef PC98 - if (sig) - com_send_break_on(com); - else - com_send_break_off(com); -#else - if (sig) - sio_setreg(com, com_cfcr, com->cfcr_image |= CFCR_SBREAK); - else - sio_setreg(com, com_cfcr, com->cfcr_image &= ~CFCR_SBREAK); -#endif -} - -static int -comparam(tp, t) - struct tty *tp; - struct termios *t; -{ - u_int cfcr; - int cflag; - struct com_s *com; - u_int divisor; - u_char dlbh; - u_char dlbl; - u_char efr_flowbits; - int s; -#ifdef PC98 - u_char param = 0; -#endif - - com = tp->t_sc; - if (com == NULL) - return (ENODEV); - -#ifdef PC98 - cfcr = 0; - - if (IS_8251(com->pc98_if_type)) { - if (pc98_ttspeedtab(com, t->c_ospeed, &divisor) != 0) - return (EINVAL); - } else { -#endif - /* check requested parameters */ - if (t->c_ispeed != (t->c_ospeed != 0 ? t->c_ospeed : tp->t_ospeed)) - return (EINVAL); - divisor = siodivisor(com->rclk, t->c_ispeed); - if (divisor == 0) - return (EINVAL); -#ifdef PC98 - } -#endif - - /* parameters are OK, convert them to the com struct and the device */ - s = spltty(); -#ifdef PC98 - if (IS_8251(com->pc98_if_type)) { - if (t->c_ospeed == 0) - com_tiocm_bic(com, TIOCM_DTR|TIOCM_RTS|TIOCM_LE); - else - com_tiocm_bis(com, TIOCM_DTR|TIOCM_RTS|TIOCM_LE); - } else -#endif - if (t->c_ospeed == 0) - (void)commodem(tp, 0, SER_DTR); /* hang up line */ - else - (void)commodem(tp, SER_DTR, 0); - cflag = t->c_cflag; -#ifdef PC98 - if (!IS_8251(com->pc98_if_type)) { -#endif - switch (cflag & CSIZE) { - case CS5: - cfcr = CFCR_5BITS; - break; - case CS6: - cfcr = CFCR_6BITS; - break; - case CS7: - cfcr = CFCR_7BITS; - break; - default: - cfcr = CFCR_8BITS; - break; - } - if (cflag & PARENB) { - cfcr |= CFCR_PENAB; - if (!(cflag & PARODD)) - cfcr |= CFCR_PEVEN; - } - if (cflag & CSTOPB) - cfcr |= CFCR_STOPB; - - if (com->hasfifo) { - /* - * Use a fifo trigger level low enough so that the input - * latency from the fifo is less than about 16 msec and - * the total latency is less than about 30 msec. These - * latencies are reasonable for humans. Serial comms - * protocols shouldn't expect anything better since modem - * latencies are larger. - * - * The fifo trigger level cannot be set at RX_HIGH for high - * speed connections without further work on reducing - * interrupt disablement times in other parts of the system, - * without producing silo overflow errors. - */ - com->fifo_image = com->unit == siotsunit ? 0 - : t->c_ispeed <= 4800 - ? FIFO_ENABLE : FIFO_ENABLE | FIFO_RX_MEDH; -#ifdef COM_ESP - /* - * The Hayes ESP card needs the fifo DMA mode bit set - * in compatibility mode. If not, it will interrupt - * for each character received. - */ - if (com->esp) - com->fifo_image |= FIFO_DMA_MODE; -#endif - sio_setreg(com, com_fifo, com->fifo_image); - } -#ifdef PC98 - } -#endif - - /* - * This returns with interrupts disabled so that we can complete - * the speed change atomically. Keeping interrupts disabled is - * especially important while com_data is hidden. - */ - (void) siosetwater(com, t->c_ispeed); - -#ifdef PC98 - if (IS_8251(com->pc98_if_type)) - com_cflag_and_speed_set(com, cflag, t->c_ospeed); - else { -#endif - sio_setreg(com, com_cfcr, cfcr | CFCR_DLAB); - /* - * Only set the divisor registers if they would change, since on - * some 16550 incompatibles (UMC8669F), setting them while input - * is arriving loses sync until data stops arriving. - */ - dlbl = divisor & 0xFF; - if (sio_getreg(com, com_dlbl) != dlbl) - sio_setreg(com, com_dlbl, dlbl); - dlbh = divisor >> 8; - if (sio_getreg(com, com_dlbh) != dlbh) - sio_setreg(com, com_dlbh, dlbh); -#ifdef PC98 - } -#endif - - efr_flowbits = 0; - - if (cflag & CRTS_IFLOW) { - com->state |= CS_RTS_IFLOW; - efr_flowbits |= EFR_AUTORTS; - /* - * If CS_RTS_IFLOW just changed from off to on, the change - * needs to be propagated to MCR_RTS. This isn't urgent, - * so do it later by calling comstart() instead of repeating - * a lot of code from comstart() here. - */ - } else if (com->state & CS_RTS_IFLOW) { - com->state &= ~CS_RTS_IFLOW; - /* - * CS_RTS_IFLOW just changed from on to off. Force MCR_RTS - * on here, since comstart() won't do it later. - */ -#ifdef PC98 - if (IS_8251(com->pc98_if_type)) - com_tiocm_bis(com, TIOCM_RTS); - else - outb(com->modem_ctl_port, com->mcr_image |= MCR_RTS); -#else - outb(com->modem_ctl_port, com->mcr_image |= MCR_RTS); -#endif - } - - /* - * Set up state to handle output flow control. - * XXX - worth handling MDMBUF (DCD) flow control at the lowest level? - * Now has 10+ msec latency, while CTS flow has 50- usec latency. - */ - com->state |= CS_ODEVREADY; - com->state &= ~CS_CTS_OFLOW; -#ifdef PC98 - if (com->pc98_if_type == COM_IF_RSA98III) { - param = inb(com->rsabase + rsa_msr); - outb(com->rsabase + rsa_msr, param & 0x14); - } -#endif - if (cflag & CCTS_OFLOW) { - com->state |= CS_CTS_OFLOW; - efr_flowbits |= EFR_AUTOCTS; -#ifdef PC98 - if (IS_8251(com->pc98_if_type)) { - if (!(pc98_get_modem_status(com) & TIOCM_CTS)) - com->state &= ~CS_ODEVREADY; - } else if (com->pc98_if_type == COM_IF_RSA98III) { - /* Set automatic flow control mode */ - outb(com->rsabase + rsa_msr, param | 0x08); - } else -#endif - if (!(com->last_modem_status & MSR_CTS)) - com->state &= ~CS_ODEVREADY; - } - -#ifdef PC98 - if (!IS_8251(com->pc98_if_type)) - sio_setreg(com, com_cfcr, com->cfcr_image = cfcr); -#else - if (com->st16650a) { - sio_setreg(com, com_lcr, LCR_EFR_ENABLE); - sio_setreg(com, com_efr, - (sio_getreg(com, com_efr) - & ~(EFR_AUTOCTS | EFR_AUTORTS)) | efr_flowbits); - } - sio_setreg(com, com_cfcr, com->cfcr_image = cfcr); -#endif - - /* XXX shouldn't call functions while intrs are disabled. */ - ttyldoptim(tp); - - mtx_unlock_spin(&sio_lock); - splx(s); - comstart(tp); - if (com->ibufold != NULL) { - free(com->ibufold, M_DEVBUF); - com->ibufold = NULL; - } - return (0); -} - -/* - * This function must be called with the sio_lock mutex released and will - * return with it obtained. - */ -static int -siosetwater(com, speed) - struct com_s *com; - speed_t speed; -{ - int cp4ticks; - u_char *ibuf; - int ibufsize; - struct tty *tp; - - /* - * Make the buffer size large enough to handle a softtty interrupt - * latency of about 2 ticks without loss of throughput or data - * (about 3 ticks if input flow control is not used or not honoured, - * but a bit less for CS5-CS7 modes). - */ - cp4ticks = speed / 10 / hz * 4; - for (ibufsize = 128; ibufsize < cp4ticks;) - ibufsize <<= 1; -#ifdef PC98 - if (com->pc98_if_type == COM_IF_RSA98III) - ibufsize = 2048; -#endif - if (ibufsize == com->ibufsize) { - mtx_lock_spin(&sio_lock); - return (0); - } - - /* - * Allocate input buffer. The extra factor of 2 in the size is - * to allow for an error byte for each input byte. - */ - ibuf = malloc(2 * ibufsize, M_DEVBUF, M_NOWAIT); - if (ibuf == NULL) { - mtx_lock_spin(&sio_lock); - return (ENOMEM); - } - - /* Initialize non-critical variables. */ - com->ibufold = com->ibuf; - com->ibufsize = ibufsize; - tp = com->tp; - if (tp != NULL) { - tp->t_ififosize = 2 * ibufsize; - tp->t_ispeedwat = (speed_t)-1; - tp->t_ospeedwat = (speed_t)-1; - } - - /* - * Read current input buffer, if any. Continue with interrupts - * disabled. - */ - mtx_lock_spin(&sio_lock); - if (com->iptr != com->ibuf) - sioinput(com); - - /*- - * Initialize critical variables, including input buffer watermarks. - * The external device is asked to stop sending when the buffer - * exactly reaches high water, or when the high level requests it. - * The high level is notified immediately (rather than at a later - * clock tick) when this watermark is reached. - * The buffer size is chosen so the watermark should almost never - * be reached. - * The low watermark is invisibly 0 since the buffer is always - * emptied all at once. - */ - com->iptr = com->ibuf = ibuf; - com->ibufend = ibuf + ibufsize; - com->ierroff = ibufsize; - com->ihighwater = ibuf + 3 * ibufsize / 4; - return (0); -} - -static void -comstart(tp) - struct tty *tp; -{ - struct com_s *com; - int s; - - com = tp->t_sc; - if (com == NULL) - return; - s = spltty(); - mtx_lock_spin(&sio_lock); - if (tp->t_state & TS_TTSTOP) - com->state &= ~CS_TTGO; - else - com->state |= CS_TTGO; - if (tp->t_state & TS_TBLOCK) { -#ifdef PC98 - if (IS_8251(com->pc98_if_type)) { - if ((com_tiocm_get(com) & TIOCM_RTS) && - (com->state & CS_RTS_IFLOW)) - com_tiocm_bic(com, TIOCM_RTS); - } else { - if ((com->mcr_image & MCR_RTS) && - (com->state & CS_RTS_IFLOW)) - outb(com->modem_ctl_port, com->mcr_image &= ~MCR_RTS); - } -#else - if (com->mcr_image & MCR_RTS && com->state & CS_RTS_IFLOW) - outb(com->modem_ctl_port, com->mcr_image &= ~MCR_RTS); -#endif - } else { -#ifdef PC98 - if (IS_8251(com->pc98_if_type)) { - if (!(com_tiocm_get(com) & TIOCM_RTS) && - com->iptr < com->ihighwater && - com->state & CS_RTS_IFLOW) - com_tiocm_bis(com, TIOCM_RTS); - } else { - if (!(com->mcr_image & MCR_RTS) && - com->iptr < com->ihighwater && - com->state & CS_RTS_IFLOW) - outb(com->modem_ctl_port, com->mcr_image |= MCR_RTS); - } -#else - if (!(com->mcr_image & MCR_RTS) && com->iptr < com->ihighwater - && com->state & CS_RTS_IFLOW) - outb(com->modem_ctl_port, com->mcr_image |= MCR_RTS); -#endif - } - mtx_unlock_spin(&sio_lock); - if (tp->t_state & (TS_TIMEOUT | TS_TTSTOP)) { - ttwwakeup(tp); - splx(s); - return; - } - if (tp->t_outq.c_cc != 0) { - struct lbq *qp; - struct lbq *next; - - if (!com->obufs[0].l_queued) { - com->obufs[0].l_tail - = com->obuf1 + q_to_b(&tp->t_outq, com->obuf1, -#ifdef PC98 - com->obufsize); -#else - sizeof com->obuf1); -#endif - com->obufs[0].l_next = NULL; - com->obufs[0].l_queued = TRUE; - mtx_lock_spin(&sio_lock); - if (com->state & CS_BUSY) { - qp = com->obufq.l_next; - while ((next = qp->l_next) != NULL) - qp = next; - qp->l_next = &com->obufs[0]; - } else { - com->obufq.l_head = com->obufs[0].l_head; - com->obufq.l_tail = com->obufs[0].l_tail; - com->obufq.l_next = &com->obufs[0]; - com->state |= CS_BUSY; - } - mtx_unlock_spin(&sio_lock); - } - if (tp->t_outq.c_cc != 0 && !com->obufs[1].l_queued) { - com->obufs[1].l_tail - = com->obuf2 + q_to_b(&tp->t_outq, com->obuf2, -#ifdef PC98 - com->obufsize); -#else - sizeof com->obuf2); -#endif - com->obufs[1].l_next = NULL; - com->obufs[1].l_queued = TRUE; - mtx_lock_spin(&sio_lock); - if (com->state & CS_BUSY) { - qp = com->obufq.l_next; - while ((next = qp->l_next) != NULL) - qp = next; - qp->l_next = &com->obufs[1]; - } else { - com->obufq.l_head = com->obufs[1].l_head; - com->obufq.l_tail = com->obufs[1].l_tail; - com->obufq.l_next = &com->obufs[1]; - com->state |= CS_BUSY; - } - mtx_unlock_spin(&sio_lock); - } - tp->t_state |= TS_BUSY; - } - mtx_lock_spin(&sio_lock); - if (com->state >= (CS_BUSY | CS_TTGO)) - siointr1(com); /* fake interrupt to start output */ - mtx_unlock_spin(&sio_lock); - ttwwakeup(tp); - splx(s); -} - -static void -comstop(tp, rw) - struct tty *tp; - int rw; -{ - struct com_s *com; -#ifdef PC98 - int rsa98_tmp = 0; -#endif - - com = tp->t_sc; - if (com == NULL || com->gone) - return; - mtx_lock_spin(&sio_lock); - if (rw & FWRITE) { -#ifdef PC98 - if (!IS_8251(com->pc98_if_type)) { -#endif - if (com->hasfifo) -#ifdef COM_ESP - /* XXX avoid h/w bug. */ - if (!com->esp) -#endif - sio_setreg(com, com_fifo, - FIFO_XMT_RST | com->fifo_image); -#ifdef PC98 - if (com->pc98_if_type == COM_IF_RSA98III) - for (rsa98_tmp = 0; rsa98_tmp < 2048; rsa98_tmp++) - sio_setreg(com, com_fifo, - FIFO_XMT_RST | com->fifo_image); - } -#endif - com->obufs[0].l_queued = FALSE; - com->obufs[1].l_queued = FALSE; - if (com->state & CS_ODONE) - com_events -= LOTS_OF_EVENTS; - com->state &= ~(CS_ODONE | CS_BUSY); - com->tp->t_state &= ~TS_BUSY; - } - if (rw & FREAD) { -#ifdef PC98 - if (!IS_8251(com->pc98_if_type)) { - if (com->pc98_if_type == COM_IF_RSA98III) - for (rsa98_tmp = 0; rsa98_tmp < 2048; rsa98_tmp++) - sio_getreg(com, com_data); -#endif - if (com->hasfifo) -#ifdef COM_ESP - /* XXX avoid h/w bug. */ - if (!com->esp) -#endif - sio_setreg(com, com_fifo, - FIFO_RCV_RST | com->fifo_image); -#ifdef PC98 - } -#endif - com_events -= (com->iptr - com->ibuf); - com->iptr = com->ibuf; - } - mtx_unlock_spin(&sio_lock); - comstart(tp); -} - -static int -commodem(struct tty *tp, int sigon, int sigoff) -{ - struct com_s *com; - int bitand, bitor, msr; -#ifdef PC98 - int clr, set; -#endif - - com = tp->t_sc; - if (com->gone) - return(0); - if (sigon != 0 || sigoff != 0) { -#ifdef PC98 - if (IS_8251(com->pc98_if_type)) { - bitand = bitor = 0; - clr = set = 0; - if (sigoff & SER_DTR) { - bitand |= TIOCM_DTR; - clr |= CMD8251_DTR; - } - if (sigoff & SER_RTS) { - bitand |= TIOCM_RTS; - clr |= CMD8251_RxEN | CMD8251_RTS; - } - if (sigon & SER_DTR) { - bitor |= TIOCM_DTR; - set |= CMD8251_TxEN | CMD8251_RxEN | - CMD8251_DTR; - } - if (sigon & SER_RTS) { - bitor |= TIOCM_RTS; - set |= CMD8251_TxEN | CMD8251_RxEN | - CMD8251_RTS; - } - bitand = ~bitand; - mtx_lock_spin(&sio_lock); - com->pc98_prev_modem_status &= bitand; - com->pc98_prev_modem_status |= bitor; - pc98_i8251_clear_or_cmd(com, clr, set); - mtx_unlock_spin(&sio_lock); - return (0); - } else { -#endif - bitand = bitor = 0; - if (sigoff & SER_DTR) - bitand |= MCR_DTR; - if (sigoff & SER_RTS) - bitand |= MCR_RTS; - if (sigon & SER_DTR) - bitor |= MCR_DTR; - if (sigon & SER_RTS) - bitor |= MCR_RTS; - bitand = ~bitand; - mtx_lock_spin(&sio_lock); - com->mcr_image &= bitand; - com->mcr_image |= bitor; - outb(com->modem_ctl_port, com->mcr_image); - mtx_unlock_spin(&sio_lock); - return (0); -#ifdef PC98 - } -#endif - } else { -#ifdef PC98 - if (IS_8251(com->pc98_if_type)) - return (com_tiocm_get(com)); - else { -#endif - bitor = 0; - if (com->mcr_image & MCR_DTR) - bitor |= SER_DTR; - if (com->mcr_image & MCR_RTS) - bitor |= SER_RTS; - msr = com->prev_modem_status; - if (msr & MSR_CTS) - bitor |= SER_CTS; - if (msr & MSR_DCD) - bitor |= SER_DCD; - if (msr & MSR_DSR) - bitor |= SER_DSR; - if (msr & MSR_DSR) - bitor |= SER_DSR; - if (msr & (MSR_RI | MSR_TERI)) - bitor |= SER_RI; - return (bitor); -#ifdef PC98 - } -#endif - } -} - -static void -siosettimeout() -{ - struct com_s *com; - bool_t someopen; - int unit; - - /* - * Set our timeout period to 1 second if no polled devices are open. - * Otherwise set it to max(1/200, 1/hz). - * Enable timeouts iff some device is open. - */ - untimeout(comwakeup, (void *)NULL, sio_timeout_handle); - sio_timeout = hz; - someopen = FALSE; - for (unit = 0; unit < sio_numunits; ++unit) { - com = com_addr(unit); - if (com != NULL && com->tp != NULL - && com->tp->t_state & TS_ISOPEN && !com->gone) { - someopen = TRUE; - if (com->poll || com->poll_output) { - sio_timeout = hz > 200 ? hz / 200 : 1; - break; - } - } - } - if (someopen) { - sio_timeouts_until_log = hz / sio_timeout; - sio_timeout_handle = timeout(comwakeup, (void *)NULL, - sio_timeout); - } else { - /* Flush error messages, if any. */ - sio_timeouts_until_log = 1; - comwakeup((void *)NULL); - untimeout(comwakeup, (void *)NULL, sio_timeout_handle); - } -} - -static void -comwakeup(chan) - void *chan; -{ - struct com_s *com; - int unit; - - sio_timeout_handle = timeout(comwakeup, (void *)NULL, sio_timeout); - - /* - * Recover from lost output interrupts. - * Poll any lines that don't use interrupts. - */ - for (unit = 0; unit < sio_numunits; ++unit) { - com = com_addr(unit); - if (com != NULL && !com->gone - && (com->state >= (CS_BUSY | CS_TTGO) || com->poll)) { - mtx_lock_spin(&sio_lock); - siointr1(com); - mtx_unlock_spin(&sio_lock); - } - } - - /* - * Check for and log errors, but not too often. - */ - if (--sio_timeouts_until_log > 0) - return; - sio_timeouts_until_log = hz / sio_timeout; - for (unit = 0; unit < sio_numunits; ++unit) { - int errnum; - - com = com_addr(unit); - if (com == NULL) - continue; - if (com->gone) - continue; - for (errnum = 0; errnum < CE_NTYPES; ++errnum) { - u_int delta; - u_long total; - - mtx_lock_spin(&sio_lock); - delta = com->delta_error_counts[errnum]; - com->delta_error_counts[errnum] = 0; - mtx_unlock_spin(&sio_lock); - if (delta == 0) - continue; - total = com->error_counts[errnum] += delta; - log(LOG_ERR, "sio%d: %u more %s%s (total %lu)\n", - unit, delta, error_desc[errnum], - delta == 1 ? "" : "s", total); - } - } -} - -#ifdef PC98 -/* commint is called when modem control line changes */ -static void -commint(struct cdev *dev) -{ - register struct tty *tp; - int stat,delta; - struct com_s *com; - - com = dev->si_drv1; - tp = com->tp; - - stat = com_tiocm_get(com); - delta = com_tiocm_get_delta(com); - - if (com->state & CS_CTS_OFLOW) { - if (stat & TIOCM_CTS) - com->state |= CS_ODEVREADY; - else - com->state &= ~CS_ODEVREADY; - } - if ((delta & TIOCM_CAR) && (ISCALLOUT(dev)) == 0) { - if (stat & TIOCM_CAR ) - (void)ttyld_modem(tp, 1); - else if (ttyld_modem(tp, 0) == 0) { - /* negate DTR, RTS */ - com_tiocm_bic(com, (tp->t_cflag & HUPCL) ? - TIOCM_DTR|TIOCM_RTS|TIOCM_LE : TIOCM_LE ); - /* disable IENABLE */ - com_int_TxRx_disable( com ); - } - } -} -#endif - -/* - * Following are all routines needed for SIO to act as console - */ -struct siocnstate { - u_char dlbl; - u_char dlbh; - u_char ier; - u_char cfcr; - u_char mcr; -}; - -/* - * This is a function in order to not replicate "ttyd%d" more - * places than absolutely necessary. - */ -static void -siocnset(struct consdev *cd, int unit) -{ - - cd->cn_unit = unit; - sprintf(cd->cn_name, "ttyd%d", unit); -} - -static speed_t siocngetspeed(Port_t, u_long rclk); -static void siocnclose(struct siocnstate *sp, Port_t iobase); -static void siocnopen(struct siocnstate *sp, Port_t iobase, int speed); -static void siocntxwait(Port_t iobase); - -static cn_probe_t sio_cnprobe; -static cn_init_t sio_cninit; -static cn_term_t sio_cnterm; -static cn_getc_t sio_cngetc; -static cn_putc_t sio_cnputc; -static cn_grab_t sio_cngrab; -static cn_ungrab_t sio_cnungrab; - -CONSOLE_DRIVER(sio); - -static void -siocntxwait(iobase) - Port_t iobase; -{ - int timo; - - /* - * Wait for any pending transmission to finish. Required to avoid - * the UART lockup bug when the speed is changed, and for normal - * transmits. - */ - timo = 100000; - while ((inb(iobase + com_lsr) & (LSR_TSRE | LSR_TXRDY)) - != (LSR_TSRE | LSR_TXRDY) && --timo != 0) - ; -} - -/* - * Read the serial port specified and try to figure out what speed - * it's currently running at. We're assuming the serial port has - * been initialized and is basicly idle. This routine is only intended - * to be run at system startup. - * - * If the value read from the serial port doesn't make sense, return 0. - */ - -static speed_t -siocngetspeed(iobase, rclk) - Port_t iobase; - u_long rclk; -{ - u_int divisor; - u_char dlbh; - u_char dlbl; - u_char cfcr; - - cfcr = inb(iobase + com_cfcr); - outb(iobase + com_cfcr, CFCR_DLAB | cfcr); - - dlbl = inb(iobase + com_dlbl); - dlbh = inb(iobase + com_dlbh); - - outb(iobase + com_cfcr, cfcr); - - divisor = dlbh << 8 | dlbl; - - /* XXX there should be more sanity checking. */ - if (divisor == 0) - return (CONSPEED); - return (rclk / (16UL * divisor)); -} - -static void -siocnopen(sp, iobase, speed) - struct siocnstate *sp; - Port_t iobase; - int speed; -{ - u_int divisor; - u_char dlbh; - u_char dlbl; - - /* - * Save all the device control registers except the fifo register - * and set our default ones (cs8 -parenb speed=comdefaultrate). - * We can't save the fifo register since it is read-only. - */ - sp->ier = inb(iobase + com_ier); - outb(iobase + com_ier, 0); /* spltty() doesn't stop siointr() */ - siocntxwait(iobase); - sp->cfcr = inb(iobase + com_cfcr); - outb(iobase + com_cfcr, CFCR_DLAB | CFCR_8BITS); - sp->dlbl = inb(iobase + com_dlbl); - sp->dlbh = inb(iobase + com_dlbh); - /* - * Only set the divisor registers if they would change, since on - * some 16550 incompatibles (Startech), setting them clears the - * data input register. This also reduces the effects of the - * UMC8669F bug. - */ - divisor = siodivisor(comdefaultrclk, speed); - dlbl = divisor & 0xFF; - if (sp->dlbl != dlbl) - outb(iobase + com_dlbl, dlbl); - dlbh = divisor >> 8; - if (sp->dlbh != dlbh) - outb(iobase + com_dlbh, dlbh); - outb(iobase + com_cfcr, CFCR_8BITS); - sp->mcr = inb(iobase + com_mcr); - /* - * We don't want interrupts, but must be careful not to "disable" - * them by clearing the MCR_IENABLE bit, since that might cause - * an interrupt by floating the IRQ line. - */ - outb(iobase + com_mcr, (sp->mcr & MCR_IENABLE) | MCR_DTR | MCR_RTS); -} - -static void -siocnclose(sp, iobase) - struct siocnstate *sp; - Port_t iobase; -{ - /* - * Restore the device control registers. - */ - siocntxwait(iobase); - outb(iobase + com_cfcr, CFCR_DLAB | CFCR_8BITS); - if (sp->dlbl != inb(iobase + com_dlbl)) - outb(iobase + com_dlbl, sp->dlbl); - if (sp->dlbh != inb(iobase + com_dlbh)) - outb(iobase + com_dlbh, sp->dlbh); - outb(iobase + com_cfcr, sp->cfcr); - /* - * XXX damp oscillations of MCR_DTR and MCR_RTS by not restoring them. - */ - outb(iobase + com_mcr, sp->mcr | MCR_DTR | MCR_RTS); - outb(iobase + com_ier, sp->ier); -} - -static void -sio_cnprobe(cp) - struct consdev *cp; -{ - speed_t boot_speed; - u_char cfcr; - u_int divisor; - int s, unit; - struct siocnstate sp; - - /* - * Find our first enabled console, if any. If it is a high-level - * console device, then initialize it and return successfully. - * If it is a low-level console device, then initialize it and - * return unsuccessfully. It must be initialized in both cases - * for early use by console drivers and debuggers. Initializing - * the hardware is not necessary in all cases, since the i/o - * routines initialize it on the fly, but it is necessary if - * input might arrive while the hardware is switched back to an - * uninitialized state. We can't handle multiple console devices - * yet because our low-level routines don't take a device arg. - * We trust the user to set the console flags properly so that we - * don't need to probe. - */ - cp->cn_pri = CN_DEAD; - - for (unit = 0; unit < 16; unit++) { /* XXX need to know how many */ - int flags; - - if (resource_disabled("sio", unit)) - continue; - if (resource_int_value("sio", unit, "flags", &flags)) - continue; - if (COM_CONSOLE(flags) || COM_DEBUGGER(flags)) { - int port; - Port_t iobase; - - if (resource_int_value("sio", unit, "port", &port)) - continue; - iobase = port; - s = spltty(); - if ((boothowto & RB_SERIAL) && COM_CONSOLE(flags)) { - boot_speed = - siocngetspeed(iobase, comdefaultrclk); - if (boot_speed) - comdefaultrate = boot_speed; - } - - /* - * Initialize the divisor latch. We can't rely on - * siocnopen() to do this the first time, since it - * avoids writing to the latch if the latch appears - * to have the correct value. Also, if we didn't - * just read the speed from the hardware, then we - * need to set the speed in hardware so that - * switching it later is null. - */ - cfcr = inb(iobase + com_cfcr); - outb(iobase + com_cfcr, CFCR_DLAB | cfcr); - divisor = siodivisor(comdefaultrclk, comdefaultrate); - outb(iobase + com_dlbl, divisor & 0xff); - outb(iobase + com_dlbh, divisor >> 8); - outb(iobase + com_cfcr, cfcr); - - siocnopen(&sp, iobase, comdefaultrate); - - splx(s); - if (COM_CONSOLE(flags) && !COM_LLCONSOLE(flags)) { - siocnset(cp, unit); - cp->cn_pri = COM_FORCECONSOLE(flags) - || boothowto & RB_SERIAL - ? CN_REMOTE : CN_NORMAL; - siocniobase = iobase; - siocnunit = unit; - } -#ifdef GDB - if (COM_DEBUGGER(flags)) - siogdbiobase = iobase; -#endif - } - } -} - -static void -sio_cninit(cp) - struct consdev *cp; -{ - comconsole = cp->cn_unit; -} - -static void -sio_cnterm(cp) - struct consdev *cp; -{ - comconsole = -1; -} - -static void -sio_cngrab(struct consdev *cp) -{ -} - -static void -sio_cnungrab(struct consdev *cp) -{ -} - -static int -sio_cngetc(struct consdev *cd) -{ - int c; - Port_t iobase; - int s; - struct siocnstate sp; - speed_t speed; - - if (cd != NULL && cd->cn_unit == siocnunit) { - iobase = siocniobase; - speed = comdefaultrate; - } else { -#ifdef GDB - iobase = siogdbiobase; - speed = gdbdefaultrate; -#else - return (-1); -#endif - } - s = spltty(); - siocnopen(&sp, iobase, speed); - if (inb(iobase + com_lsr) & LSR_RXRDY) - c = inb(iobase + com_data); - else - c = -1; - siocnclose(&sp, iobase); - splx(s); - return (c); -} - -static void -sio_cnputc(struct consdev *cd, int c) -{ - int need_unlock; - int s; - struct siocnstate sp; - Port_t iobase; - speed_t speed; - - if (cd != NULL && cd->cn_unit == siocnunit) { - iobase = siocniobase; - speed = comdefaultrate; - } else { -#ifdef GDB - iobase = siogdbiobase; - speed = gdbdefaultrate; -#else - return; -#endif - } - s = spltty(); - need_unlock = 0; - if (!kdb_active && sio_inited == 2 && !mtx_owned(&sio_lock)) { - mtx_lock_spin(&sio_lock); - need_unlock = 1; - } - siocnopen(&sp, iobase, speed); - siocntxwait(iobase); - outb(iobase + com_data, c); - siocnclose(&sp, iobase); - if (need_unlock) - mtx_unlock_spin(&sio_lock); - splx(s); -} - -/* - * Remote gdb(1) support. - */ - -#if defined(GDB) - -#include <gdb/gdb.h> - -static gdb_probe_f siogdbprobe; -static gdb_init_f siogdbinit; -static gdb_term_f siogdbterm; -static gdb_getc_f siogdbgetc; -static gdb_putc_f siogdbputc; - -GDB_DBGPORT(sio, siogdbprobe, siogdbinit, siogdbterm, siogdbgetc, siogdbputc); - -static int -siogdbprobe(void) -{ - return ((siogdbiobase != 0) ? 0 : -1); -} - -static void -siogdbinit(void) -{ -} - -static void -siogdbterm(void) -{ -} - -static void -siogdbputc(int c) -{ - sio_cnputc(NULL, c); -} - -static int -siogdbgetc(void) -{ - return (sio_cngetc(NULL)); -} - -#endif - -#ifdef PC98 -/* - * pc98 local function - */ -static void -com_tiocm_bis(struct com_s *com, int msr) -{ - int s; - int tmp = 0; - - s=spltty(); - com->pc98_prev_modem_status |= ( msr & (TIOCM_LE|TIOCM_DTR|TIOCM_RTS) ); - tmp |= CMD8251_TxEN|CMD8251_RxEN; - if ( msr & TIOCM_DTR ) tmp |= CMD8251_DTR; - if ( msr & TIOCM_RTS ) tmp |= CMD8251_RTS; - - pc98_i8251_or_cmd( com, tmp ); - splx(s); -} - -static void -com_tiocm_bic(struct com_s *com, int msr) -{ - int s; - int tmp = msr; - - s=spltty(); - com->pc98_prev_modem_status &= ~( msr & (TIOCM_LE|TIOCM_DTR|TIOCM_RTS) ); - if ( msr & TIOCM_DTR ) tmp |= CMD8251_DTR; - if ( msr & TIOCM_RTS ) tmp |= CMD8251_RTS; - - pc98_i8251_clear_cmd( com, tmp ); - splx(s); -} - -static int -com_tiocm_get(struct com_s *com) -{ - return( com->pc98_prev_modem_status ); -} - -static int -com_tiocm_get_delta(struct com_s *com) -{ - int tmp; - - tmp = com->pc98_modem_delta; - com->pc98_modem_delta = 0; - return( tmp ); -} - -/* convert to TIOCM_?? ( ioctl.h ) */ -static int -pc98_get_modem_status(struct com_s *com) -{ - register int msr; - - msr = com->pc98_prev_modem_status - & ~(TIOCM_CAR|TIOCM_RI|TIOCM_DSR|TIOCM_CTS); - if (com->pc98_8251fifo_enable) { - int stat2; - - stat2 = inb(I8251F_msr); - if ( stat2 & MSR_DCD ) msr |= TIOCM_CAR; - if ( stat2 & MSR_RI ) msr |= TIOCM_RI; - if ( stat2 & MSR_DSR ) msr |= TIOCM_DSR; - if ( stat2 & MSR_CTS ) msr |= TIOCM_CTS; -#if COM_CARRIER_DETECT_EMULATE - if ( msr & (TIOCM_DSR|TIOCM_CTS) ) { - msr |= TIOCM_CAR; - } -#endif - } else { - int stat, stat2; - - stat = inb(com->sts_port); - stat2 = inb(com->in_modem_port); - if ( !(stat2 & CICSCD_CD) ) msr |= TIOCM_CAR; - if ( !(stat2 & CICSCD_CI) ) msr |= TIOCM_RI; - if ( stat & STS8251_DSR ) msr |= TIOCM_DSR; - if ( !(stat2 & CICSCD_CS) ) msr |= TIOCM_CTS; -#if COM_CARRIER_DETECT_EMULATE - if ( msr & (TIOCM_DSR|TIOCM_CTS) ) { - msr |= TIOCM_CAR; - } -#endif - } - return(msr); -} - -static void -pc98_check_msr(void* chan) -{ - int msr, delta; - int s; - register struct tty *tp; - struct com_s *com; - struct cdev *dev; - - dev=(struct cdev *)chan; - com = dev->si_drv1; - tp = dev->si_tty; - - s = spltty(); - msr = pc98_get_modem_status(com); - /* make change flag */ - delta = msr ^ com->pc98_prev_modem_status; - if ( delta & TIOCM_CAR ) { - if ( com->modem_car_chg_timer ) { - if ( -- com->modem_car_chg_timer ) - msr ^= TIOCM_CAR; - } else { - if ((com->modem_car_chg_timer = (msr & TIOCM_CAR) ? - DCD_ON_RECOGNITION : DCD_OFF_TOLERANCE) != 0) - msr ^= TIOCM_CAR; - } - } else - com->modem_car_chg_timer = 0; - delta = ( msr ^ com->pc98_prev_modem_status ) & - (TIOCM_CAR|TIOCM_RI|TIOCM_DSR|TIOCM_CTS); - com->pc98_prev_modem_status = msr; - delta = ( com->pc98_modem_delta |= delta ); - splx(s); - if ( com->modem_checking || (tp->t_state & (TS_ISOPEN)) ) { - if ( delta ) { - commint(dev); - } - timeout(pc98_check_msr, (caddr_t)dev, - PC98_CHECK_MODEM_INTERVAL); - } else { - com->modem_checking = 0; - } -} - -static void -pc98_msrint_start(struct cdev *dev) -{ - struct com_s *com; - int s = spltty(); - - com = dev->si_drv1; - /* modem control line check routine envoke interval is 1/10 sec */ - if ( com->modem_checking == 0 ) { - com->pc98_prev_modem_status = pc98_get_modem_status(com); - com->pc98_modem_delta = 0; - timeout(pc98_check_msr, (caddr_t)dev, - PC98_CHECK_MODEM_INTERVAL); - com->modem_checking = 1; - } - splx(s); -} - -static void -pc98_disable_i8251_interrupt(struct com_s *com, int mod) -{ - /* disable interrupt */ - register int tmp; - - mod |= ~(IEN_Tx|IEN_TxEMP|IEN_Rx); - COM_INT_DISABLE - tmp = inb( com->intr_ctrl_port ) & ~(IEN_Tx|IEN_TxEMP|IEN_Rx); - outb( com->intr_ctrl_port, (com->intr_enable&=~mod) | tmp ); - COM_INT_ENABLE -} - -static void -pc98_enable_i8251_interrupt(struct com_s *com, int mod) -{ - register int tmp; - - COM_INT_DISABLE - tmp = inb( com->intr_ctrl_port ) & ~(IEN_Tx|IEN_TxEMP|IEN_Rx); - outb( com->intr_ctrl_port, (com->intr_enable|=mod) | tmp ); - COM_INT_ENABLE -} - -static int -pc98_check_i8251_interrupt(struct com_s *com) -{ - return ( com->intr_enable & 0x07 ); -} - -static void -pc98_i8251_clear_cmd(struct com_s *com, int x) -{ - int tmp; - - COM_INT_DISABLE - tmp = com->pc98_prev_siocmd & ~(x); - if (com->pc98_8251fifo_enable) - outb(I8251F_fcr, 0); - outb(com->cmd_port, tmp); - com->pc98_prev_siocmd = tmp & ~(CMD8251_ER|CMD8251_RESET|CMD8251_EH); - if (com->pc98_8251fifo_enable) - outb(I8251F_fcr, FIFO_ENABLE); - COM_INT_ENABLE -} - -static void -pc98_i8251_or_cmd(struct com_s *com, int x) -{ - int tmp; - - COM_INT_DISABLE - if (com->pc98_8251fifo_enable) - outb(I8251F_fcr, 0); - tmp = com->pc98_prev_siocmd | (x); - outb(com->cmd_port, tmp); - com->pc98_prev_siocmd = tmp & ~(CMD8251_ER|CMD8251_RESET|CMD8251_EH); - if (com->pc98_8251fifo_enable) - outb(I8251F_fcr, FIFO_ENABLE); - COM_INT_ENABLE -} - -static void -pc98_i8251_set_cmd(struct com_s *com, int x) -{ - int tmp; - - COM_INT_DISABLE - if (com->pc98_8251fifo_enable) - outb(I8251F_fcr, 0); - tmp = (x); - outb(com->cmd_port, tmp); - com->pc98_prev_siocmd = tmp & ~(CMD8251_ER|CMD8251_RESET|CMD8251_EH); - if (com->pc98_8251fifo_enable) - outb(I8251F_fcr, FIFO_ENABLE); - COM_INT_ENABLE -} - -static void -pc98_i8251_clear_or_cmd(struct com_s *com, int clr, int x) -{ - int tmp; - COM_INT_DISABLE - if (com->pc98_8251fifo_enable) - outb(I8251F_fcr, 0); - tmp = com->pc98_prev_siocmd & ~(clr); - tmp |= (x); - outb(com->cmd_port, tmp); - com->pc98_prev_siocmd = tmp & ~(CMD8251_ER|CMD8251_RESET|CMD8251_EH); - if (com->pc98_8251fifo_enable) - outb(I8251F_fcr, FIFO_ENABLE); - COM_INT_ENABLE -} - -static int -pc98_i8251_get_cmd(struct com_s *com) -{ - return com->pc98_prev_siocmd; -} - -static int -pc98_i8251_get_mod(struct com_s *com) -{ - return com->pc98_prev_siomod; -} - -static void -pc98_i8251_reset(struct com_s *com, int mode, int command) -{ - if (com->pc98_8251fifo_enable) - outb(I8251F_fcr, 0); - outb(com->cmd_port, 0); /* dummy */ - DELAY(2); - outb(com->cmd_port, 0); /* dummy */ - DELAY(2); - outb(com->cmd_port, 0); /* dummy */ - DELAY(2); - outb(com->cmd_port, CMD8251_RESET); /* internal reset */ - DELAY(2); - outb(com->cmd_port, mode ); /* mode register */ - com->pc98_prev_siomod = mode; - DELAY(2); - pc98_i8251_set_cmd( com, (command|CMD8251_ER) ); - DELAY(10); - if (com->pc98_8251fifo_enable) - outb(I8251F_fcr, FIFO_ENABLE | FIFO_XMT_RST | FIFO_RCV_RST); -} - -static void -pc98_check_sysclock(void) -{ - /* get system clock from port */ - if ( pc98_machine_type & M_8M ) { - /* 8 MHz system & H98 */ - sysclock = 8; - } else { - /* 5 MHz system */ - sysclock = 5; - } -} - -static void -com_cflag_and_speed_set( struct com_s *com, int cflag, int speed) -{ - int cfcr=0; - int previnterrupt; - int tmp; - u_int count; - - if (pc98_ttspeedtab(com, speed, &count) != 0) - return; - - previnterrupt = pc98_check_i8251_interrupt(com); - pc98_disable_i8251_interrupt( com, IEN_Tx|IEN_TxEMP|IEN_Rx ); - - switch ( cflag&CSIZE ) { - case CS5: - cfcr = MOD8251_5BITS; break; - case CS6: - cfcr = MOD8251_6BITS; break; - case CS7: - cfcr = MOD8251_7BITS; break; - case CS8: - cfcr = MOD8251_8BITS; break; - } - if ( cflag&PARENB ) { - if ( cflag&PARODD ) - cfcr |= MOD8251_PENAB; - else - cfcr |= MOD8251_PENAB | MOD8251_PEVEN; - } - - if ( cflag&CSTOPB ) - cfcr |= MOD8251_STOP2; - else - cfcr |= MOD8251_STOP1; - - if ( count & 0x10000 ) - cfcr |= MOD8251_CLKx1; - else - cfcr |= MOD8251_CLKx16; - - while (!((tmp = inb(com->sts_port)) & STS8251_TxEMP)) - ; - - /* set baud rate from ospeed */ - pc98_set_baud_rate( com, count ); - - if ( cfcr != pc98_i8251_get_mod(com) ) - pc98_i8251_reset(com, cfcr, pc98_i8251_get_cmd(com) ); - - pc98_enable_i8251_interrupt( com, previnterrupt ); -} - -static int -pc98_ttspeedtab(struct com_s *com, int speed, u_int *divisor) -{ - int if_type, effect_sp, count = -1, mod; - - if_type = com->pc98_if_type & 0x0f; - - switch (com->pc98_if_type) { - case COM_IF_INTERNAL: - if (PC98SIO_baud_rate_port(if_type) != -1) { - count = ttspeedtab(speed, if_8251_type[if_type].speedtab); - if (count > 0) { - count |= COM1_EXT_CLOCK; - break; - } - } - - /* for *1CLK asynchronous! mode, TEFUTEFU */ - mod = (sysclock == 5) ? 2457600 : 1996800; - effect_sp = ttspeedtab( speed, pc98speedtab ); - if ( effect_sp < 0 ) /* XXX */ - effect_sp = ttspeedtab( (speed - 1), pc98speedtab ); - if ( effect_sp <= 0 ) - return effect_sp; - if ( effect_sp == speed ) - mod /= 16; - if ( mod % effect_sp ) - return(-1); - count = mod / effect_sp; - if ( count > 65535 ) - return(-1); - if ( effect_sp != speed ) - count |= 0x10000; - break; - case COM_IF_PC9861K_1: - case COM_IF_PC9861K_2: - count = 1; - break; - case COM_IF_IND_SS_1: - case COM_IF_IND_SS_2: - case COM_IF_PIO9032B_1: - case COM_IF_PIO9032B_2: - count = ttspeedtab( speed, if_8251_type[if_type].speedtab ); - break; - case COM_IF_B98_01_1: - case COM_IF_B98_01_2: - count = ttspeedtab( speed, if_8251_type[if_type].speedtab ); -#ifdef B98_01_OLD - if (count == 0 || count == 1) { - count += 4; - count |= 0x20000; /* x1 mode for 76800 and 153600 */ - } -#endif - break; - } - - if (count < 0) - return count; - - *divisor = (u_int) count; - return 0; -} - -static void -pc98_set_baud_rate( struct com_s *com, u_int count ) -{ - int if_type, io, s; - - if_type = com->pc98_if_type & 0x0f; - io = rman_get_start(com->ioportres) & 0xff00; - - switch (com->pc98_if_type) { - case COM_IF_INTERNAL: - if (PC98SIO_baud_rate_port(if_type) != -1) { - if (count & COM1_EXT_CLOCK) { - outb((Port_t)PC98SIO_baud_rate_port(if_type), count & 0xff); - break; - } else { - outb((Port_t)PC98SIO_baud_rate_port(if_type), 0x09); - } - } - - if (count == 0) - return; - - /* set i8253 */ - s = splclock(); - if (count != 3) - outb( 0x77, 0xb6 ); - else - outb( 0x77, 0xb4 ); - outb( 0x5f, 0); - outb( 0x75, count & 0xff ); - outb( 0x5f, 0); - outb( 0x75, (count >> 8) & 0xff ); - splx(s); - break; - case COM_IF_IND_SS_1: - case COM_IF_IND_SS_2: - outb(io | PC98SIO_intr_ctrl_port(if_type), 0); - outb(io | PC98SIO_baud_rate_port(if_type), 0); - outb(io | PC98SIO_baud_rate_port(if_type), 0xc0); - outb(io | PC98SIO_baud_rate_port(if_type), (count >> 8) | 0x80); - outb(io | PC98SIO_baud_rate_port(if_type), count & 0xff); - break; - case COM_IF_PIO9032B_1: - case COM_IF_PIO9032B_2: - outb(io | PC98SIO_baud_rate_port(if_type), count); - break; - case COM_IF_B98_01_1: - case COM_IF_B98_01_2: - outb(io | PC98SIO_baud_rate_port(if_type), count & 0x0f); -#ifdef B98_01_OLD - /* - * Some old B98_01 board should be controlled - * in different way, but this hasn't been tested yet. - */ - outb(io | PC98SIO_func_port(if_type), - (count & 0x20000) ? 0xf0 : 0xf2); -#endif - break; - } -} -static int -pc98_check_if_type(device_t dev, struct siodev *iod) -{ - int irr, io, if_type, tmp; - static short irq_tab[2][8] = { - { 3, 5, 6, 9, 10, 12, 13, -1}, - { 3, 10, 12, 13, 5, 6, 9, -1} - }; - - if_type = iod->if_type & 0x0f; - iod->irq = 0; - io = isa_get_port(dev) & 0xff00; - - if (IS_8251(iod->if_type)) { - if (PC98SIO_func_port(if_type) != -1) { - outb(io | PC98SIO_func_port(if_type), 0xf2); - tmp = ttspeedtab(9600, if_8251_type[if_type].speedtab); - if (tmp != -1 && PC98SIO_baud_rate_port(if_type) != -1) - outb(io | PC98SIO_baud_rate_port(if_type), tmp); - } - - iod->cmd = io | PC98SIO_cmd_port(if_type); - iod->sts = io | PC98SIO_sts_port(if_type); - iod->mod = io | PC98SIO_in_modem_port(if_type); - iod->ctrl = io | PC98SIO_intr_ctrl_port(if_type); - - if (iod->if_type == COM_IF_INTERNAL) { - iod->irq = 4; - - if (pc98_check_8251vfast()) { - PC98SIO_baud_rate_port(if_type) = I8251F_div; - if_8251_type[if_type].speedtab = pc98fast_speedtab; - } - } else { - tmp = inb( iod->mod ) & if_8251_type[if_type].irr_mask; - if ((isa_get_port(dev) & 0xff) == IO_COM2) - iod->irq = irq_tab[0][tmp]; - else - iod->irq = irq_tab[1][tmp]; - } - } else { - irr = if_16550a_type[if_type].irr_read; -#ifdef COM_MULTIPORT - if (!COM_ISMULTIPORT(device_get_flags(dev)) || - device_get_unit(dev) == COM_MPMASTER(device_get_flags(dev))) -#endif - if (irr != -1) { - tmp = inb(io | irr); - if (isa_get_port(dev) & 0x01) /* XXX depend on RSB-384 */ - iod->irq = irq_tab[1][tmp >> 3]; - else - iod->irq = irq_tab[0][tmp & 0x07]; - } - iod->cmd = 0; - iod->sts = 0; - iod->mod = 0; - iod->ctrl = 0; - } - if ( iod->irq == -1 ) return -1; - - return 0; -} -static void -pc98_set_ioport(struct com_s *com) -{ - int if_type = com->pc98_if_type & 0x0f; - Port_t io = rman_get_start(com->ioportres) & 0xff00; - - pc98_check_sysclock(); - com->data_port = io | PC98SIO_data_port(if_type); - com->cmd_port = io | PC98SIO_cmd_port(if_type); - com->sts_port = io | PC98SIO_sts_port(if_type); - com->in_modem_port = io | PC98SIO_in_modem_port(if_type); - com->intr_ctrl_port = io | PC98SIO_intr_ctrl_port(if_type); -} -static int -pc98_check_8251vfast(void) -{ - int i; - - outb(I8251F_div, 0x8c); - DELAY(10); - for (i = 0; i < 100; i++) { - if ((inb(I8251F_div) & 0x80) != 0) { - i = 0; - break; - } - DELAY(1); - } - outb(I8251F_div, 0); - DELAY(10); - for (; i < 100; i++) { - if ((inb(I8251F_div) & 0x80) == 0) - return 1; - DELAY(1); - } - - return 0; -} -static int -pc98_check_8251fifo(void) -{ - u_char tmp1, tmp2; - - tmp1 = inb(I8251F_iir); - DELAY(10); - tmp2 = inb(I8251F_iir); - if (((tmp1 ^ tmp2) & 0x40) != 0 && ((tmp1 | tmp2) & 0x20) == 0) - return 1; - - return 0; -} -#endif /* PC98 defined */ diff --git a/sys/pc98/cbus/sio_cbus.c b/sys/pc98/cbus/sio_cbus.c deleted file mode 100644 index 2df560cd90cd..000000000000 --- a/sys/pc98/cbus/sio_cbus.c +++ /dev/null @@ -1,119 +0,0 @@ -/*- - * Copyright (c) 2001 TAKAHASHI Yoshihiro - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD$ - */ - -#include <sys/param.h> -#include <sys/systm.h> -#include <sys/bus.h> -#include <sys/conf.h> -#include <sys/kernel.h> -#include <sys/lock.h> -#include <sys/malloc.h> -#include <sys/mutex.h> -#include <sys/module.h> -#include <sys/tty.h> -#include <machine/bus.h> -#include <sys/timepps.h> - -#include <dev/sio/siovar.h> - -#include <isa/isavar.h> - -static int sio_isa_attach(device_t dev); -static int sio_isa_probe(device_t dev); - -static device_method_t sio_isa_methods[] = { - /* Device interface */ - DEVMETHOD(device_probe, sio_isa_probe), - DEVMETHOD(device_attach, sio_isa_attach), - DEVMETHOD(device_detach, siodetach), - - { 0, 0 } -}; - -static driver_t sio_isa_driver = { - sio_driver_name, - sio_isa_methods, - 0, -}; - -static struct isa_pnp_id sio_ids[] = { - {0x0100e4a5, "RSA-98III"}, - {0x4180a3b8, NULL}, /* NEC8041 - PC-9821CB-B04 */ - {0x0181a3b8, NULL}, /* NEC8101 - PC-9821CB2-B04 */ - {0x5181a3b8, NULL}, /* NEC8151 - Internal FAX/Modem for Cx3, Cb3 */ - {0x9181a3b8, NULL}, /* NEC8191 - NEC PC-9801-120 */ - {0xe181a3b8, NULL}, /* NEC81E1 - Internal FAX/Modem */ - {0x1182a3b8, NULL}, /* NEC8211 - PC-9801-123 */ - {0x3182a3b8, NULL}, /* NEC8231 - Internal FAX/Modem(Voice) */ - {0x4182a3b8, NULL}, /* NEC8241 - NEC PC-9821NR-B05 */ - {0x5182a3b8, NULL}, /* NEC8251 - Internel FAX/Modem */ - {0x7182a3b8, NULL}, /* NEC8271 - NEC PC-9801-125 */ - {0x11802fbf, NULL}, /* OYO8011 - Internal FAX/Modem for ValueStar(Ring) */ - {0} -}; - -static int -sio_isa_probe(dev) - device_t dev; -{ - int logical_id; - - /* Check isapnp ids */ - if (ISA_PNP_PROBE(device_get_parent(dev), dev, sio_ids) == ENXIO) - return (ENXIO); - - logical_id = isa_get_logicalid(dev); - switch (logical_id) { - case 0x0100e4a5: /* RSA-98III */ - SET_FLAG(dev, SET_IFTYPE(COM_IF_RSA98III)); - break; - case 0x4180a3b8: /* PC-9821CB-B04 */ - case 0x0181a3b8: /* PC-9821CB2-B04 */ - case 0x5181a3b8: /* for Cx3, Cb3 internal */ - case 0x9181a3b8: /* PC-9801-120 */ - case 0xe181a3b8: /* Internal FAX/Modem */ - case 0x1182a3b8: /* PC-9801-123 */ - case 0x3182a3b8: /* FAX/Voice/Modem internal */ - case 0x4182a3b8: /* PC-9821NR-B05 */ - case 0x5182a3b8: /* FAX/Modem internal */ - case 0x7182a3b8: /* PC-9801-125 */ - case 0x11802fbf: /* for ValueStar internal */ - SET_FLAG(dev, SET_IFTYPE(COM_IF_NS16550)); - break; - } - - return (sioprobe(dev, 0, 0UL, 0)); -} - -static int -sio_isa_attach(dev) - device_t dev; -{ - return (sioattach(dev, 0, 0UL)); -} - -DRIVER_MODULE(sio, isa, sio_isa_driver, sio_devclass, 0, 0); diff --git a/sys/pc98/cbus/syscons_cbus.c b/sys/pc98/cbus/syscons_cbus.c deleted file mode 100644 index e5c29795ee2a..000000000000 --- a/sys/pc98/cbus/syscons_cbus.c +++ /dev/null @@ -1,202 +0,0 @@ -/*- - * Copyright (c) 1999 FreeBSD(98) Porting Team. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer as - * the first lines of this file unmodified. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#include "opt_syscons.h" - -#include <sys/param.h> -#include <sys/systm.h> -#include <sys/kernel.h> -#include <sys/module.h> -#include <sys/bus.h> -#include <sys/cons.h> -#include <sys/consio.h> -#include <sys/sysctl.h> - -#include <machine/clock.h> - -#include <pc98/pc98/pc98_machdep.h> - -#include <dev/syscons/syscons.h> - -#include <isa/isavar.h> - -static devclass_t sc_devclass; - -static sc_softc_t main_softc; - -static void -scidentify(driver_t *driver, device_t parent) -{ - - BUS_ADD_CHILD(parent, ISA_ORDER_SPECULATIVE, "sc", 0); -} - -static int -scprobe(device_t dev) -{ - - /* No pnp support */ - if (isa_get_vendorid(dev)) - return (ENXIO); - - device_set_desc(dev, "System console"); - return (sc_probe_unit(device_get_unit(dev), device_get_flags(dev))); -} - -static int -scattach(device_t dev) -{ - - return sc_attach_unit(device_get_unit(dev), device_get_flags(dev)); -} - -int -sc_max_unit(void) -{ - - return (devclass_get_maxunit(sc_devclass)); -} - -sc_softc_t -*sc_get_softc(int unit, int flags) -{ - sc_softc_t *sc; - - if (unit < 0) - return (NULL); - if ((flags & SC_KERNEL_CONSOLE) != 0) { - /* FIXME: clear if it is wired to another unit! */ - sc = &main_softc; - } else { - sc = device_get_softc(devclass_get_device(sc_devclass, unit)); - if (sc == NULL) - return (NULL); - } - sc->unit = unit; - if ((sc->flags & SC_INIT_DONE) == 0) { - sc->keyboard = -1; - sc->adapter = -1; - sc->mouse_char = SC_MOUSE_CHAR; - } - return (sc); -} - -sc_softc_t -*sc_find_softc(struct video_adapter *adp, struct keyboard *kbd) -{ - sc_softc_t *sc; - int i; - int units; - - sc = &main_softc; - if ((adp == NULL || adp == sc->adp) && - (kbd == NULL || kbd == sc->kbd)) - return (sc); - units = devclass_get_maxunit(sc_devclass); - for (i = 0; i < units; ++i) { - sc = device_get_softc(devclass_get_device(sc_devclass, i)); - if (sc == NULL) - continue; - if ((adp == NULL || adp == sc->adp) && - (kbd == NULL || kbd == sc->kbd)) - return (sc); - } - return (NULL); -} - -int -sc_get_cons_priority(int *unit, int *flags) -{ - const char *at; - int f, u; - - *unit = -1; - for (u = 0; u < 16; u++) { - if (resource_disabled(SC_DRIVER_NAME, u)) - continue; - if (resource_string_value(SC_DRIVER_NAME, u, "at", &at) != 0) - continue; - if (resource_int_value(SC_DRIVER_NAME, u, "flags", &f) != 0) - f = 0; - if (f & SC_KERNEL_CONSOLE) { - /* the user designates this unit to be the console */ - *unit = u; - *flags = f; - break; - } - if (*unit < 0) { - /* ...otherwise remember the first found unit */ - *unit = u; - *flags = f; - } - } - if (*unit < 0) { - *unit = 0; - *flags = 0; - } - return (CN_INTERNAL); -} - -void -sc_get_bios_values(bios_values_t *values) -{ - values->cursor_start = 15; - values->cursor_end = 16; - values->shift_state = 0; - values->bell_pitch = BELL_PITCH; -} - -int -sc_tone(int herz) -{ - - if (herz) { - if (timer_spkr_acquire()) - return (EBUSY); - timer_spkr_setfreq(herz); - } else - timer_spkr_release(); - - return (0); -} - -static device_method_t sc_methods[] = { - DEVMETHOD(device_identify, scidentify), - DEVMETHOD(device_probe, scprobe), - DEVMETHOD(device_attach, scattach), - { 0, 0 } -}; - -static driver_t sc_driver = { - SC_DRIVER_NAME, - sc_methods, - sizeof(sc_softc_t), -}; - -DRIVER_MODULE(sc, isa, sc_driver, sc_devclass, 0, 0); diff --git a/sys/pc98/conf/DEFAULTS b/sys/pc98/conf/DEFAULTS deleted file mode 100644 index 6c8b561841aa..000000000000 --- a/sys/pc98/conf/DEFAULTS +++ /dev/null @@ -1,31 +0,0 @@ -# -# DEFAULTS -- Default kernel configuration file for FreeBSD/pc98 -# -# $FreeBSD$ - -machine pc98 i386 -options PC98 - -# Bus support. -device isa -options ISAPNP - -# Floating point support. -device npx - -# Pseudo devices. -device mem # Memory and kernel memory devices -device io # I/O device - -# UART chips on this platform -device uart_ns8250 -#device uart_i8251 - -# Default partitioning schemes -options GEOM_PART_BSD -options GEOM_PART_PC98 - -# enable support for native hardware -device atpic - -options NEW_PCIB diff --git a/sys/pc98/conf/GENERIC b/sys/pc98/conf/GENERIC deleted file mode 100644 index 3f9364cf30ef..000000000000 --- a/sys/pc98/conf/GENERIC +++ /dev/null @@ -1,262 +0,0 @@ -# -# GENERIC -- Generic kernel configuration file for FreeBSD/pc98 -# -# For more information on this file, please read the config(5) manual page, -# and/or the handbook section on Kernel Configuration Files: -# -# http://www.FreeBSD.org/doc/en_US.ISO8859-1/books/handbook/kernelconfig-config.html -# -# The handbook is also available locally in /usr/share/doc/handbook -# if you've installed the doc distribution, otherwise always see the -# FreeBSD World Wide Web server (http://www.FreeBSD.org/) for the -# latest information. -# -# An exhaustive list of options and more detailed explanations of the -# device lines is also present in the ../../conf/NOTES and NOTES files. -# If you are in doubt as to the purpose or necessity of a line, check first -# in NOTES. -# -# $FreeBSD$ - -cpu I486_CPU -cpu I586_CPU -cpu I686_CPU -ident GENERIC - -makeoptions DEBUG=-g # Build kernel with gdb(1) debug symbols - -options SCHED_4BSD # 4BSD scheduler -#options PREEMPTION # Enable kernel thread preemption -options INET # InterNETworking -options INET6 # IPv6 communications protocols -options IPSEC # IP (v4/v6) security -options TCP_HHOOK # hhook(9) framework for TCP -options SCTP # Stream Control Transmission Protocol -options FFS # Berkeley Fast Filesystem -options SOFTUPDATES # Enable FFS soft updates support -options UFS_ACL # Support for access control lists -options UFS_DIRHASH # Improve performance on big directories -options UFS_GJOURNAL # Enable gjournal-based UFS journaling -options QUOTA # Enable disk quotas for UFS -options MD_ROOT # MD is a potential root device -options NFSCL # Network Filesystem Client -options NFSD # Network Filesystem Server -options NFSLOCKD # Network Lock Manager -options NFS_ROOT # NFS usable as /, requires NFSCL -options MSDOSFS # MSDOS Filesystem -options CD9660 # ISO 9660 Filesystem -options PROCFS # Process filesystem (requires PSEUDOFS) -options PSEUDOFS # Pseudo-filesystem framework -options GEOM_PART_GPT # GUID Partition Tables. -options GEOM_LABEL # Provides labelization -options COMPAT_FREEBSD4 # Compatible with FreeBSD4 -options COMPAT_FREEBSD5 # Compatible with FreeBSD5 -options COMPAT_FREEBSD6 # Compatible with FreeBSD6 -options COMPAT_FREEBSD7 # Compatible with FreeBSD7 -options COMPAT_FREEBSD9 # Compatible with FreeBSD9 -options COMPAT_FREEBSD10 # Compatible with FreeBSD10 -options COMPAT_FREEBSD11 # Compatible with FreeBSD11 -options SCSI_DELAY=5000 # Delay (in ms) before probing SCSI -options EPSON_BOUNCEDMA # use bounce buffer for 15-16M -#options EPSON_MEMWIN # EPSON memory window support -#options LINE30 -options KTRACE # ktrace(1) support -options STACK # stack(9) support -options SYSVSHM # SYSV-style shared memory -options SYSVMSG # SYSV-style message queues -options SYSVSEM # SYSV-style semaphores -options _KPOSIX_PRIORITY_SCHEDULING # POSIX P1003_1B real-time extensions -options PRINTF_BUFR_SIZE=128 # Prevent printf output being interspersed. -options KBD_INSTALL_CDEV # install a CDEV entry in /dev -options HWPMC_HOOKS # Necessary kernel hooks for hwpmc(4) -options AUDIT # Security event auditing -options CAPABILITY_MODE # Capsicum capability mode -options CAPABILITIES # Capsicum capabilities -options MAC # TrustedBSD MAC Framework -options INCLUDE_CONFIG_FILE # Include this file in kernel -options RACCT # Resource accounting framework -options RACCT_DEFAULT_TO_DISABLED # Set kern.racct.enable=0 by default -options RCTL # Resource limits - -# Debugging support. Always need this: -options KDB # Enable kernel debugger support. -options KDB_TRACE # Print a stack trace for a panic. - -# To make an SMP kernel, the next two lines are needed -#options SMP # Symmetric MultiProcessor Kernel -#device apic # I/O APIC - -# Bus support. -device pci - -# Floppy drives -device fdc - -# ATA controllers -device ahci # AHCI-compatible SATA controllers -device ata # Legacy ATA/SATA controllers -device mvs # Marvell 88SX50XX/88SX60XX/88SX70XX/SoC SATA -device siis # SiliconImage SiI3124/SiI3132/SiI3531 SATA - -# SCSI Controllers -device ahc # AHA2940 and onboard AIC7xxx devices -device esp # AMD Am53C974 (Tekram DC-390(T)) -device isp # Qlogic family -#device ncr # NCR/Symbios Logic -device sym # NCR/Symbios Logic (newer chipsets + those of `ncr') - -device adv # Advansys SCSI adapters -device aic # PC-9801-100 -device ct # host adapter using WD33C93[ABC] chip - -device ncv # NCR 53C500 -device nsp # Workbit Ninja SCSI-3 -device stg # TMC 18C30/18C50 - -# ATA/SCSI peripherals -device scbus # SCSI bus (required for ATA/SCSI) -device ch # SCSI media changers -device da # Direct Access (disks) -device sa # Sequential Access (tape etc) -device cd # CD -device pass # Passthrough device (direct ATA/SCSI access) -device ses # Enclosure Services (SES and SAF-TE) -#device ctl # CAM Target Layer - -# keyboard driver -device pckbd # PC98 keyboard - -device gdc # GDC screen - -device splash # Splash screen and screen saver support - -# syscons is the default console driver, resembling an SCO console -device sc - -#device agp # support several AGP chipsets - -# Power management support (see NOTES for more options) -#device apm -#device pmc -#device canbus -#device canbepm -# Add suspend/resume support for the i8254. -#device pmtimer - -# PCCARD (PCMCIA) support -# PCMCIA and cardbus bridge support -device cbb # cardbus (yenta) bridge -device pccard # PC Card (16-bit) bus -device cardbus # CardBus (32-bit) bus - -# Serial (COM) ports -#options COM_MULTIPORT -#options COM_ESP # ESP98 -#device sio # 8250, 16[45]50, 8251 based serial ports -device uart # Generic UART driver - -device mse -#device joy - -# Parallel port -device ppc -device ppbus # Parallel port bus (required) -device lpt # Printer -device ppi # Parallel port interface device -#device vpo # Requires scbus and da -# OLD Parallel port -#device olpt - -device puc # Multi I/O cards and multi-channel UARTs - -# PCI Ethernet NICs. -device de # DEC/Intel DC21x4x (``Tulip'') -#device em # Intel PRO/1000 Gigabit Ethernet Family -device le # AMD Am7900 LANCE and Am79C9xx PCnet -#device ti # Alteon Networks Tigon I/II gigabit Ethernet -device txp # 3Com 3cR990 (``Typhoon'') -device vx # 3Com 3c590, 3c595 (``Vortex'') - -# PCI Ethernet NICs that use the common MII bus controller code. -# NOTE: Be sure to keep the 'device miibus' line in order to use these NICs! -device miibus # MII bus support -device bfe # Broadcom BCM440x 10/100 Ethernet -#device bge # Broadcom BCM570xx Gigabit Ethernet -device dc # DEC/Intel 21143 and various workalikes -device fxp # Intel EtherExpress PRO/100B (82557, 82558) -#device lge # Level 1 LXT1001 gigabit Ethernet -#device nge # NatSemi DP83820 gigabit Ethernet -device pcn # AMD Am79C97x PCI 10/100 (precedence over 'le') -device re # RealTek 8139C+/8169/8169S/8110S -device rl # RealTek 8129/8139 -device sf # Adaptec AIC-6915 (``Starfire'') -device sis # Silicon Integrated Systems SiS 900/SiS 7016 -#device sk # SysKonnect SK-984x & SK-982x gigabit Ethernet -device ste # Sundance ST201 (D-Link DFE-550TX) -device tl # Texas Instruments ThunderLAN -device tx # SMC EtherPower II (83c170 ``EPIC'') -#device vge # VIA VT612x gigabit Ethernet -device vr # VIA Rhine, Rhine II -device wb # Winbond W89C840F -device xl # 3Com 3c90x (``Boomerang'', ``Cyclone'') - -# ISA Ethernet NICs. pccard NICs included. -# 'device ed' requires 'device miibus' -device ed # NE[12]000, SMC Ultra, 3c503, DS8390 cards -device ep # Etherlink III based cards -device fe # Fujitsu MB8696x based cards -device sn # SMC's 9000 series of Ethernet chips -device snc -device xe # Xircom pccard Ethernet - -# Wireless NIC cards -#device wlan # 802.11 support -#options IEEE80211_DEBUG # enable debug msgs -#options IEEE80211_AMPDU_AGE # age frames in AMPDU reorder q's -options IEEE80211_SUPPORT_MESH # enable 802.11s draft support -#device wlan_wep # 802.11 WEP support -#device wlan_ccmp # 802.11 CCMP support -#device wlan_tkip # 802.11 TKIP support -#device wlan_amrr # AMRR transmit rate control algorithm -#device an # Aironet 4500/4800 802.11 wireless NICs. -#device ath # Atheros NICs -#device ath_pci # Atheros pci/cardbus glue -#device ath_hal # pci/cardbus chip support -options AH_SUPPORT_AR5416 # enable AR5416 tx/rx descriptors -#device ath_rate_sample # SampleRate tx rate control for ath -#device ral # Ralink Technology RT2500 wireless NICs. -#device wi # WaveLAN/Intersil/Symbol 802.11 wireless NICs. -#device wl # Older non 802.11 Wavelan wireless NIC. - -# Pseudo devices. -device loop # Network loopback -device random # Entropy device -device ether # Ethernet support -device vlan # 802.1Q VLAN support -device tun # Packet tunnel. -device md # Memory "disks" -device gif # IPv6 and IPv4 tunneling -device firmware # firmware assist module - -# The `bpf' device enables the Berkeley Packet Filter. -# Be aware of the administrative consequences of enabling this! -# Note that 'bpf' is required for DHCP. -device bpf # Berkeley packet filter - -# USB support -#options USB_DEBUG # enable debug msgs -#device uhci # UHCI PCI->USB interface -#device ohci # OHCI PCI->USB interface -#device ehci # EHCI PCI->USB interface (USB 2.0) -#device usb # USB Bus (required) -#device ukbd # Keyboard -#device umass # Disks/Mass storage - Requires scbus and da - -# Sound support -#device sound # Generic sound driver (required) -#device snd_mss # Microsoft Sound System -#device "snd_sb16" # Sound Blaster 16 -#device snd_sbc # Sound Blaster - -# The crypto framework is required by IPSEC -device crypto # Required by IPSEC diff --git a/sys/pc98/conf/GENERIC-NODEBUG b/sys/pc98/conf/GENERIC-NODEBUG deleted file mode 100644 index 7863b44f1db0..000000000000 --- a/sys/pc98/conf/GENERIC-NODEBUG +++ /dev/null @@ -1,38 +0,0 @@ -# -# GENERIC-NODEBUG -- WITNESS and INVARIANTS free kernel configuration file -# for FreeBSD/pc98 -# -# This configuration file removes several debugging options, including -# WITNESS and INVARIANTS checking, which are known to have significant -# performance impact on running systems. When benchmarking new features -# this kernel should be used instead of the standard GENERIC. -# This kernel configuration should never appear outside of the HEAD -# of the FreeBSD tree. -# -# For more information on this file, please read the config(5) manual page, -# and/or the handbook section on Kernel Configuration Files: -# -# http://www.FreeBSD.org/doc/en_US.ISO8859-1/books/handbook/kernelconfig-config.html -# -# The handbook is also available locally in /usr/share/doc/handbook -# if you've installed the doc distribution, otherwise always see the -# FreeBSD World Wide Web server (http://www.FreeBSD.org/) for the -# latest information. -# -# An exhaustive list of options and more detailed explanations of the -# device lines is also present in the ../../conf/NOTES and NOTES files. -# If you are in doubt as to the purpose or necessity of a line, check first -# in NOTES. -# -# $FreeBSD$ - -include GENERIC - -ident GENERIC-NODEBUG - -nooptions INVARIANTS -nooptions INVARIANT_SUPPORT -nooptions WITNESS -nooptions WITNESS_SKIPSPIN -nooptions DEADLKRES - diff --git a/sys/pc98/conf/GENERIC.hints b/sys/pc98/conf/GENERIC.hints deleted file mode 100644 index 171c11b543bd..000000000000 --- a/sys/pc98/conf/GENERIC.hints +++ /dev/null @@ -1,294 +0,0 @@ -# $FreeBSD$ - -hint.atacbus.0.at="isa" -hint.atacbus.0.port="0x640" -hint.atacbus.0.irq="9" - -hint.fdc.0.at="isa" -hint.fdc.0.port="0x090" -hint.fdc.0.irq="11" -hint.fdc.0.drq="2" -hint.fd.0.at="fdc0" -hint.fd.0.drive="0" -hint.fd.1.at="fdc0" -hint.fd.1.drive="1" -hint.fd.2.at="fdc0" -hint.fd.2.drive="2" -hint.fd.3.at="fdc0" -hint.fd.3.drive="3" - -# PC-9801-100 -hint.aic.0.at="isa" -hint.aic.0.port="0x1840" -hint.aic.0.irq="5" -hint.aic.0.flags="0x10000" - -# GENERIC -hint.ct.0.at="isa" -# SC98 -#hint.ct.0.at="isa" -#hint.ct.0.flags="0x10000" -# TEXA -#hint.ct.0.at="isa" -#hint.ct.0.flags="0x20000" -# ELECOM -#hint.ct.0.at="isa" -#hint.ct.0.flags="0x30000" -# SMIT -#hint.ct.0.at="isa" -#hint.ct.0.maddr="0xdc000" -#hint.ct.0.flags="0x40000" -# LOGITEC -#hint.ct.0.at="isa" -#hint.ct.0.flags="0x50000" - -hint.attimer.0.at="isa" -hint.attimer.0.port="0x71" -hint.attimer.0.irq="0" - -hint.pcrtc.0.at="isa" - -hint.pckbd.0.at="isa" -hint.pckbd.0.port="0x041" -hint.pckbd.0.irq="1" -hint.gdc.0.at="isa" -hint.sc.0.at="isa" - -#hint.apm.0.disabled="1" -#hint.apm.0.flags="0x20" -#hint.pmc.0.at="isa" -#hint.pmc.0.port="0x8f0" - -# Microsoft Sound System -#hint.pcm.0.at="isa" -#hint.pcm.0.port="0xf40" -#hint.pcm.0.irq="12" -#hint.pcm.0.drq="1" -#hint.pcm.0.flags="0x10000" -# Sound Blaster 16 -#hint.sbc.0.at="isa" -#hint.sbc.0.port="0x20d2" -#hint.sbc.0.irq="10" -#hint.sbc.0.drq="3" - -# COM1 -hint.sio.0.at="isa" -hint.sio.0.port="0x030" -hint.sio.0.irq="4" -# COM2 (2nd CCU) -hint.sio.1.at="isa" -hint.sio.1.port="0x238" -hint.sio.1.irq="5" -hint.sio.1.flags="0x12000000" -# PC-9861K, PC-9801-101, MDC-926Rs -#hint.sio.1.at="isa" -#hint.sio.1.port="0x0B1" -#hint.sio.1.irq="5" -#hint.sio.1.flags="0x01000000" -#hint.sio.2.at="isa" -#hint.sio.2.port="0x0B9" -#hint.sio.2.irq="6" -#hint.sio.2.flags="0x02000000" -# PC-9801-120 (PnP off) -#hint.sio.1.at="isa" -#hint.sio.1.port="0x8b0" -#hint.sio.1.irq="5" -#hint.sio.1.flags="0x11000000" -# MC-16550II, MC-RS98 -#hint.sio.1.at="isa" -#hint.sio.1.port="0xd2" -#hint.sio.1.irq="5" -#hint.sio.1.flags="0x14000101" -#hint.sio.2.at="isa" -#hint.sio.2.port="0x8d2" -#hint.sio.2.flags="0x14000101" -# RSB-2000, RSB-3000, B98-02 -#hint.sio.1.at="isa" -#hint.sio.1.port="0xb0" -#hint.sio.1.flags="0x15000101" -#hint.sio.2.at="isa" -#hint.sio.2.port="0xb1" -#hint.sio.2.flags="0x15000101" -# RSB-384 -#hint.sio.1.at="isa" -#hint.sio.1.port="0xb0" -#hint.sio.1.flags="0x16000000" -#hint.sio.2.at="isa" -#hint.sio.2.port="0xb1" -#hint.sio.2.flags="0x16000000" -# RSA-98III -#hint.sio.1.at="isa" -#hint.sio.1.port="0x50e0" -#hint.sio.1.irq="5" -#hint.sio.1.flags="0x18000101" -#hint.sio.2.at="isa" -#hint.sio.2.port="0x51e0" -#hint.sio.2.flags="0x18000101" -# ESP98 -#hint.sio.1.at="isa" -#hint.sio.1.port="0x18b0" -#hint.sio.1.irq="5" -#hint.sio.1.flags="0x19000000" - -# COM2 (2nd CCU) -hint.uart.1.at="isa" -hint.uart.1.port="0x238" -hint.uart.1.irq="5" - -hint.mse.0.at="isa" -hint.mse.0.port="0x7FD9" -hint.mse.0.irq="13" - -#hint.joy.0.at="isa" -#hint.joy.0.port="0x04d2" - -hint.ppc.0.at="isa" -hint.ppc.0.irq="14" -hint.olpt.0.at="isa" -hint.olpt.0.port="0x040" - -# -# ed0: generic driver/EtherEZ98 -# ed1: LANEED LD-BDN -# ed2: EGY-98 -# ed3: LGY-98 -# ed4: ICM-IF-2766/EN-2298-T -# ed5: SIC-98 -# ed6: PC-9801-108 -# ed7: LA-98 -# ed8: C-NET(98) -# ed9: C-NET(98)E/L -# ed10: EC/EP-98X -# ed11: SB-9801 -# ed12: NC5098 -# -hint.ed.0.at="isa" -hint.ed.0.port="0x00d0" -hint.ed.0.irq="6" -# EtherEZ98 -#hint.ed.0.at="isa" -#hint.ed.0.port="0x10d0" -#hint.ed.0.irq="6" -#hint.ed.0.maddr="0xc8000" -# SIC-98 -hint.ed.5.at="isa" -hint.ed.5.port="0x00d0" -hint.ed.5.irq="6" -hint.ed.5.maddr="0xd0000" -hint.ed.5.msize="16384" -hint.ed.5.flags="0x600000" -hint.ed.5.disabled="1" -# SIU-98-E -#hint.ed.5.at="isa" -#hint.ed.5.port="0x00d0" -#hint.ed.5.irq="6" -#hint.ed.5.maddr="0xd0000" -#hint.ed.5.msize="32768" -#hint.ed.5.flags="0x610000" -# LANEED LD-BDN -hint.ed.1.at="isa" -hint.ed.1.port="0x00d8" -hint.ed.1.irq="6" -hint.ed.1.flags="0x200000" -hint.ed.1.disabled="1" -# LGY-98 -hint.ed.3.at="isa" -hint.ed.3.port="0x00d0" -hint.ed.3.irq="6" -hint.ed.3.flags="0x400000" -hint.ed.3.disabled="1" -# ICM-IF-2766/EN-2298-T -hint.ed.4.at="isa" -hint.ed.4.port="0x56d0" -hint.ed.4.irq="5" -hint.ed.4.flags="0x500000" -hint.ed.4.disabled="1" -# EGY-98 -hint.ed.2.at="isa" -hint.ed.2.port="0x00d8" -hint.ed.2.irq="6" -hint.ed.2.flags="0x300000" -hint.ed.2.disabled="1" -# LA-98 -hint.ed.7.at="isa" -hint.ed.7.port="0x00d0" -hint.ed.7.irq="6" -hint.ed.7.flags="0x900000" -hint.ed.7.disabled="1" -# PC-9801-77 -#hint.ed.7.at="isa" -#hint.ed.7.port="0x00d0" -#hint.ed.7.irq="6" -#hint.ed.7.flags="0x910000" -# PC-9801-108 -hint.ed.6.at="isa" -hint.ed.6.port="0x0770" -hint.ed.6.irq="6" -hint.ed.6.flags="0x800000" -hint.ed.6.disabled="1" -# C-NET(98)E/L -hint.ed.9.at="isa" -hint.ed.9.port="0x03d0" -hint.ed.9.irq="6" -hint.ed.9.flags="0xb00000" -hint.ed.9.disabled="1" -# C-NET(98)E/L(0x55ED) -#hint.ed.9.at="isa" -#hint.ed.9.port="0x03d0" -#hint.ed.9.irq="6" -#hint.ed.9.flags="0xb10000" -# C-NET(98) -hint.ed.8.at="isa" -hint.ed.8.port="0xa3d0" -hint.ed.8.irq="6" -hint.ed.8.maddr="0xd0000" -hint.ed.8.msize="16384" -hint.ed.8.flags="0xa00000" -hint.ed.8.disabled="1" -# EN1646 -#hint.ed.10.at="isa" -#hint.ed.10.port="0x00d0" -#hint.ed.10.irq="3" -#hint.ed.10.flags="0xd00000" -# EC/EP-98X -hint.ed.10.at="isa" -hint.ed.10.port="0x00d0" -hint.ed.10.irq="3" -hint.ed.10.flags="0xd10000" -hint.ed.10.disabled="1" -# SB-9801 -hint.ed.11.at="isa" -hint.ed.11.port="0x00d0" -hint.ed.11.irq="3" -hint.ed.11.flags="0xe00000" -hint.ed.11.disabled="1" -# SN-9801-2 -#hint.ed.11.at="isa" -#hint.ed.11.port="0x00d0" -#hint.ed.11.irq="3" -#hint.ed.11.flags="0xe00001" -# NC5098 -hint.ed.12.at="isa" -hint.ed.12.port="0x20d0" -hint.ed.12.irq="3" -hint.ed.12.flags="0xf00000" -hint.ed.12.disabled="1" - -# fe0: RE1000/1000Plus/AccessPC N98C+/LAC-98 -hint.fe.0.at="isa" -hint.fe.0.port="0x00d0" -hint.fe.0.irq="3" -# fe1: C-NET(98)P2/C-NET(9N)E -hint.fe.1.at="isa" -hint.fe.1.port="0x73d0" -hint.fe.1.irq="5" - -# C-NET(98)S -hint.le.0.at="isa" -hint.le.0.port="0x03d0" -hint.le.0.irq="6" - -hint.snc.0.at="isa" -hint.snc.0.port="0x888" -hint.snc.0.irq="6" -hint.snc.0.maddr="0xc0000" diff --git a/sys/pc98/conf/Makefile b/sys/pc98/conf/Makefile deleted file mode 100644 index dabcd9a48a54..000000000000 --- a/sys/pc98/conf/Makefile +++ /dev/null @@ -1,5 +0,0 @@ -# $FreeBSD$ - -TARGET=pc98 - -.include "${.CURDIR}/../../conf/makeLINT.mk" diff --git a/sys/pc98/conf/NOTES b/sys/pc98/conf/NOTES deleted file mode 100644 index b8cdc6a1fc39..000000000000 --- a/sys/pc98/conf/NOTES +++ /dev/null @@ -1,628 +0,0 @@ -# -# NOTES -- Lines that can be cut/pasted into kernel and hints configs. -# -# This file contains machine dependent kernel configuration notes. For -# machine independent notes, look in /sys/conf/NOTES. -# -# $FreeBSD$ -# - -# -# We want LINT to cover profiling as well. -profile 2 - - -##################################################################### -# SMP OPTIONS: -# -# The apic device enables the use of the I/O APIC for interrupt delivery. -# The apic device can be used in both UP and SMP kernels, but is required -# for SMP kernels. Thus, the apic device is not strictly an SMP option, -# but it is a prerequisite for SMP. -# - -# Mandatory: -device apic # I/O apic - -# -# Watchdog routines. -# -options MP_WATCHDOG - - - -##################################################################### -# CPU OPTIONS - -# -# You must specify at least one CPU (the one you intend to run on); -# deleting the specification for CPUs you don't need to use may make -# parts of the system run faster. -# -cpu I486_CPU -cpu I586_CPU # aka Pentium(tm) -cpu I686_CPU # aka Pentium Pro(tm) - -# -# Options for CPU features. -# -# CPU_BLUELIGHTNING_3X enables triple-clock mode on IBM Blue Lightning -# CPU if CPU supports it. The default is double-clock mode on -# BlueLightning CPU box. -# -# CPU_BLUELIGHTNING_FPU_OP_CACHE enables FPU operand cache on IBM -# BlueLightning CPU. It works only with Cyrix FPU, and this option -# should not be used with Intel FPU. -# -# CPU_BTB_EN enables branch target buffer on Cyrix 5x86 (NOTE 1). -# -# CPU_CYRIX_NO_LOCK enables weak locking for the entire address space -# of Cyrix 6x86 and 6x86MX CPUs by setting the NO_LOCK bit of CCR1. -# Otherwise, the NO_LOCK bit of CCR1 is cleared. (NOTE 3) -# -# CPU_DIRECT_MAPPED_CACHE sets L1 cache of Cyrix 486DLC CPU in direct -# mapped mode. Default is 2-way set associative mode. -# -# CPU_DISABLE_5X86_LSSER disables load store serialize (i.e., enables -# reorder). This option should not be used if you use memory mapped -# I/O device(s). -# -# CPU_DISABLE_CMPXCHG disables the CMPXCHG instruction on > i386 IA32 -# machines. VmWare 3.x seems to emulate this instruction poorly, causing -# the guest OS to run very slowly. This problem appears to be fixed in -# VmWare 4.x, at least in version 4.5.2, so that enabling this option with -# VmWare 4.x will result in locking operations to be 20-30 times slower. -# Enabling this with an SMP kernel will cause the kernel to be unusable. -# -# CPU_DISABLE_SSE explicitly prevents I686_CPU from turning on SSE. -# -# CPU_FASTER_5X86_FPU enables faster FPU exception handler. -# -# CPU_I486_ON_386 enables CPU cache on i486 based CPU upgrade products -# for i386 machines. -# -# CPU_IORT defines I/O clock delay time (NOTE 1). Default values of -# I/O clock delay time on Cyrix 5x86 and 6x86 are 0 and 7,respectively -# (no clock delay). -# -# CPU_L2_LATENCY specifies the L2 cache latency value. This option is used -# only when CPU_PPRO2CELERON is defined and Mendocino Celeron is detected. -# The default value is 5. -# -# CPU_LOOP_EN prevents flushing the prefetch buffer if the destination -# of a jump is already present in the prefetch buffer on Cyrix 5x86(NOTE -# 1). -# -# CPU_PPRO2CELERON enables L2 cache of Mendocino Celeron CPUs. This option -# is useful when you use Socket 8 to Socket 370 converter, because most Pentium -# Pro BIOSs do not enable L2 cache of Mendocino Celeron CPUs. -# -# CPU_RSTK_EN enables return stack on Cyrix 5x86 (NOTE 1). -# -# CPU_SUSP_HLT enables suspend on HALT. If this option is set, CPU -# enters suspend mode following execution of HALT instruction. -# -# CPU_UPGRADE_HW_CACHE eliminates unneeded cache flush instruction(s). -# -# CPU_WT_ALLOC enables write allocation on Cyrix 6x86/6x86MX and AMD -# K5/K6/K6-2 CPUs. -# -# CYRIX_CACHE_WORKS enables CPU cache on Cyrix 486 CPUs with cache -# flush at hold state. -# -# CYRIX_CACHE_REALLY_WORKS enables (1) CPU cache on Cyrix 486 CPUs -# without cache flush at hold state, and (2) write-back CPU cache on -# Cyrix 6x86 whose revision < 2.7 (NOTE 2). -# -# NO_F00F_HACK disables the hack that prevents Pentiums (and ONLY -# Pentiums) from locking up when a LOCK CMPXCHG8B instruction is -# executed. This option is only needed if I586_CPU is also defined, -# and should be included for any non-Pentium CPU that defines it. -# -# NO_MEMORY_HOLE is an optimisation for systems with AMD K6 processors -# which indicates that the 15-16MB range is *definitely* not being -# occupied by an ISA memory hole. -# -# NOTE 1: The options, CPU_BTB_EN, CPU_LOOP_EN, CPU_IORT, -# CPU_LOOP_EN and CPU_RSTK_EN should not be used because of CPU bugs. -# These options may crash your system. -# -# NOTE 2: If CYRIX_CACHE_REALLY_WORKS is not set, CPU cache is enabled -# in write-through mode when revision < 2.7. If revision of Cyrix -# 6x86 >= 2.7, CPU cache is always enabled in write-back mode. -# -# NOTE 3: This option may cause failures for software that requires -# locked cycles in order to operate correctly. -# -options CPU_BLUELIGHTNING_3X -options CPU_BLUELIGHTNING_FPU_OP_CACHE -options CPU_BTB_EN -options CPU_DIRECT_MAPPED_CACHE -options CPU_DISABLE_5X86_LSSER -options CPU_DISABLE_CMPXCHG -#options CPU_DISABLE_SSE -options CPU_FASTER_5X86_FPU -options CPU_I486_ON_386 -options CPU_IORT -options CPU_L2_LATENCY=5 -options CPU_LOOP_EN -options CPU_PPRO2CELERON -options CPU_RSTK_EN -options CPU_SUSP_HLT -options CPU_UPGRADE_HW_CACHE -options CPU_WT_ALLOC -options CYRIX_CACHE_WORKS -options CYRIX_CACHE_REALLY_WORKS -#options NO_F00F_HACK - -# Debug options -options NPX_DEBUG # enable npx debugging - -# -# PERFMON causes the driver for Pentium/Pentium Pro performance counters -# to be compiled. See perfmon(4) for more information. -# -options PERFMON - - -##################################################################### -# NETWORKING OPTIONS - -# -# DEVICE_POLLING adds support for mixed interrupt-polling handling -# of network device drivers, which has significant benefits in terms -# of robustness to overloads and responsivity, as well as permitting -# accurate scheduling of the CPU time between kernel network processing -# and other activities. The drawback is a moderate (up to 1/HZ seconds) -# potential increase in response times. -# It is strongly recommended to use HZ=1000 or 2000 with DEVICE_POLLING -# to achieve smoother behaviour. -# Additionally, you can enable/disable polling at runtime with help of -# the ifconfig(8) utility, and select the CPU fraction reserved to -# userland with the sysctl variable kern.polling.user_frac -# (default 50, range 0..100). -# -# Not all device drivers support this mode of operation at the time of -# this writing. See polling(4) for more details. - -options DEVICE_POLLING - -# BPF_JITTER adds support for BPF just-in-time compiler. - -options BPF_JITTER - - -##################################################################### -# MISCELLANEOUS DEVICES AND OPTIONS - -# -# sio: serial ports (see sio(4)), including support for various -# PC Card devices, such as Modem and NICs -# -#device sio -hint.sio.0.at="isa" -hint.sio.0.port="0x3F8" -hint.sio.0.flags="0x10" -hint.sio.0.irq="4" - -# `flags' specific to sio(4). -# 0x10 enable console support for this unit. Other console flags -# (if applicable) are ignored unless this is set. Enabling -# console support does not make the unit the preferred console. -# Boot with -h or set boot_serial=YES in the loader. For sio(4) -# specifically, the 0x20 flag can also be set (see above). -# Currently, at most one unit can have console support; the -# first one (in config file order) with this flag set is -# preferred. Setting this flag for sio0 gives the old behaviour. -# 0x20 force this unit to be the console (unless there is another -# higher priority console). This replaces the COMCONSOLE option. -# 0x40 reserve this unit for low level console operations. Do not -# access the device in any normal way. -# 0x80 use this port for serial line gdb support in ddb. Also known -# as debug port. -# PnP `flags' -# 0x1 disable probing of this device. Used to prevent your modem -# from being attached as a PnP modem. -# Other flags for sio that aren't documented in the man page. -# 0x20000 enable hardware RTS/CTS and larger FIFOs. Only works for -# ST16650A-compatible UARTs. - -# Options for sio: -options COM_ESP # Code for Hayes ESP. -options COM_MULTIPORT # Code for some cards with shared IRQs. -options CONSPEED=115200 # Speed for serial console - # (default 9600). - -device speaker #Play IBM BASIC-style noises out your speaker -hint.speaker.0.at="isa" -hint.speaker.0.port="0x35" -device gzip #Exec gzipped a.out's. REQUIRES COMPAT_AOUT! -device apm_saver # Requires APM - - -##################################################################### -# HARDWARE BUS CONFIGURATION - -# -# ISA bus -# -device isa - -# -# Options for `isa': -# -# AUTO_EOI_1 enables the `automatic EOI' feature for the master 8259A -# interrupt controller. This saves about 0.7-1.25 usec for each interrupt. -# This option breaks suspend/resume on some portables. -# -# MAXMEM specifies the amount of RAM on the machine; if this is not -# specified, FreeBSD will first read the amount of memory from the CMOS -# RAM, so the amount of memory will initially be limited to 64MB or 16MB -# depending on the BIOS. If the BIOS reports 64MB, a memory probe will -# then attempt to detect the installed amount of RAM. If this probe -# fails to detect >64MB RAM you will have to use the MAXMEM option. -# The amount is in kilobytes, so for a machine with 128MB of RAM, it would -# be 131072 (128 * 1024). -# -# BROKEN_KEYBOARD_RESET disables the use of the keyboard controller to -# reset the CPU for reboot. This is needed on some systems with broken -# keyboard controllers. -# -# EPSON_BOUNCEDMA was to use a bounce buffer to upper 15MB, but it's -# broken now. -# -# EPSON_MEMWIN disables 15-16MB chunk, and enables EPSON memory window. -# - -options AUTO_EOI_1 - -options MAXMEM=(128*1024) -#options BROKEN_KEYBOARD_RESET -options EPSON_BOUNCEDMA -options EPSON_MEMWIN - -# -# AGP GART support -device agp - -# AGP debugging. -options AGP_DEBUG - - -##################################################################### -# HARDWARE DEVICE CONFIGURATION - -# PC98 keyboard -device pckbd -hint.pckbd.0.at="isa" -hint.pckbd.0.port="0x041" -hint.pckbd.0.irq="1" - -# GDC screen -device gdc -hint.gdc.0.at="isa" -options LINE30 - -# -# The Numeric Processing eXtension driver. This is non-optional. -device npx - -# -# `flags' for npx0: -# 0x01 don't use the npx registers to optimize bcopy. -# 0x02 don't use the npx registers to optimize bzero. -# 0x04 don't use the npx registers to optimize copyin or copyout. -# The npx registers are normally used to optimize copying and zeroing when -# all of the following conditions are satisfied: -# I586_CPU is an option -# the cpu is an i586 (perhaps not a Pentium) -# the probe for npx0 succeeds -# INT 16 exception handling works. -# Then copying and zeroing using the npx registers is normally 30-100% faster. -# The flags can be used to control cases where it doesn't work or is slower. -# Setting them at boot time using hints works right (the optimizations -# are not used until later in the bootstrap when npx0 is attached). -# Flag 0x08 automatically disables the i586 optimized routines. -# - -# -# Optional devices: -# - -# 3Dfx Voodoo Graphics, Voodoo II /dev/3dfx CDEV support. This will create -# the /dev/3dfx0 device to work with glide implementations. This should get -# linked to /dev/3dfx and /dev/voodoo. Note that this is not the same as -# the tdfx DRI module from XFree86 and is completely unrelated. -# -# To enable Linuxulator support, one must also include COMPAT_LINUX in the -# config as well. The other option is to load both as modules. - -device tdfx # Enable 3Dfx Voodoo support -device tdfx_linux # Enable Linuxulator support - -# Direct Rendering modules for 3D acceleration. -device drm # DRM core module required by DRM drivers -device mach64drm # ATI Rage Pro, Rage Mobility P/M, Rage XL -device mgadrm # AGP Matrox G200, G400, G450, G550 -device r128drm # ATI Rage 128 -device radeondrm # ATI Radeon -device savagedrm # S3 Savage3D, Savage4 -device sisdrm # SiS 300/305, 540, 630 -device tdfxdrm # 3dfx Voodoo 3/4/5 and Banshee -options DRM_DEBUG # Include debug printfs (slow) - -# -# Bus mouse -# -device mse -hint.mse.0.at="isa" -hint.mse.0.port="0x7fd9" -hint.mse.0.irq="13" - -# -# Network interfaces: -# - -# ce: Cronyx Tau-PCI/32 sync single/dual port G.703/E1 serial adaptor -# with 32 HDLC subchannels (requires sppp (default), or NETGRAPH if -# NETGRAPH_CRONYX is configured) -# cp: Cronyx Tau-PCI sync single/dual/four port -# V.35/RS-232/RS-530/RS-449/X.21/G.703/E1/E3/T3/STS-1 -# serial adaptor (requires sppp (default), or NETGRAPH if -# NETGRAPH_CRONYX is configured) -# cs: IBM Etherjet and other Crystal Semi CS89x0-based adapters and pccard -# ed: Western Digital and SMC 80xx; Novell NE1000 and NE2000; 3Com 3C503 -# HP PC Lan+, various PC Card devices -# (requires miibus) -# ie: AT&T StarLAN 10 and EN100; 3Com 3C507; unknown NI5210; -# Intel EtherExpress -# le: AMD Am7900 LANCE and Am79C9xx ILACC/PCnet Ethernet interface driver -# sbni: Granch SBNI12-xx ISA and PCI adapters -# snc: National Semiconductor DP8393X SONIC Ethernet adapter driver - -# Order for ISA/EISA devices is important here - -device ce -device cp -device cs -device ed -hint.ed.0.at="isa" -hint.ed.0.port="0x280" -hint.ed.0.irq="5" -hint.ed.0.maddr="0xd8000" -#device le -# Hint for the PC98-only C-NET(98)S C-bus front-end of le(4). -hint.le.0.at="isa" -hint.le.0.port="0x03d0" -hint.le.0.irq="6" -device sbni -hint.sbni.0.at="isa" -hint.sbni.0.port="0x210" -hint.sbni.0.irq="0xefdead" -hint.sbni.0.flags="0" -device snc -hint.snc.0.at="isa" -hint.snc.0.port="0x888" -hint.snc.0.irq="6" -hint.snc.0.maddr="0xc0000" - -# -# SCSI host adapters: -# -# ct: WD33C93[ABC] based SCSI host adapters. -# ncv: NCR 53C500 based SCSI host adapters. -# nsp: Workbit Ninja SCSI-3 based PC Card SCSI host adapters. -# stg: TMC 18C30, 18C50 based SCSI host adapters. - -device ct -hint.ct.0.at="isa" -device ncv -device nsp -device stg - -# -# SafeNet crypto driver: can be moved to the MI NOTES as soon as -# it's tested on a big-endian machine -# -device safe # SafeNet 1141 -options SAFE_DEBUG # enable debugging support: hw.safe.debug -options SAFE_RNDTEST # enable rndtest support - -##################################################################### - -# -# Miscellaneous hardware: -# -# apm: Laptop Advanced Power Management (experimental) -# canbus: CanBe I/O Bus -# canbepm: CanBe Power Management Controller -# olpt: XXX -# pmc: Power Management Controller of NEC PC-98Note -# pmtimer: Timer device driver for power management events (APM or ACPI) -# Adjusts system timer at wakeup time -# -# Notes on APM -# The flags takes the following meaning for apm0: -# 0x0020 Statclock is broken. - -device apm -hint.apm.0.flags="0x20" -device canbus -device canbepm -device olpt -hint.olpt.0.at="isa" -hint.olpt.0.port="0x040" -device pmc -hint.pmc.0.at="isa" -hint.pmc.0.port="0x8f0" -device pmtimer - -# -# Laptop/Notebook options: -# -# See also: -# apm under `Miscellaneous hardware' -# above. - -# For older notebooks that signal a powerfail condition (external -# power supply dropped, or battery state low) by issuing an NMI: - -options POWERFAIL_NMI # make it beep instead of panicing - -# -# Set the number of PV entries per process. Increasing this can -# stop panics related to heavy use of shared memory. However, that can -# (combined with large amounts of physical memory) cause panics at -# boot time due the kernel running out of VM space. -# -# If you're tweaking this, you might also want to increase the sysctls -# "vm.v_free_min", "vm.v_free_reserved", and "vm.v_free_target". -# -# The value below is the one more than the default. -# -options PMAP_SHPGPERPROC=201 - -# -# Change the size of the kernel virtual address space. Due to -# constraints in loader(8) on i386, this must be a multiple of 4. -# 256 = 1 GB of kernel address space. Increasing this also causes -# a reduction of the address space in user processes. 512 splits -# the 4GB cpu address space in half (2GB user, 2GB kernel). -# -options KVA_PAGES=260 - - -##################################################################### -# ABI Emulation - -# Enable iBCS2 runtime support for SCO and ISC binaries -#options IBCS2 - -# Emulate spx device for client side of SVR3 local X interface -options SPX_HACK - -# Enable Linux ABI emulation -options COMPAT_LINUX - -# Enable i386 a.out binary support -options COMPAT_AOUT - -# Enable the linux-like proc filesystem support (requires COMPAT_LINUX -# and PSEUDOFS) -options LINPROCFS - -# Enable the linux-like sys filesystem support (requires COMPAT_LINUX -# and PSEUDOFS) -options LINSYSFS - -# -# SysVR4 ABI emulation -# -# The svr4 ABI emulator can be statically compiled into the kernel or loaded as -# a KLD module. -# The STREAMS network emulation code can also be compiled statically or as a -# module. If loaded as a module, it must be loaded before the svr4 module -# (the /usr/sbin/svr4 script does this for you). If compiling statically, -# the `streams' device must be configured into any kernel which also -# specifies COMPAT_SVR4. It is possible to have a statically-configured -# STREAMS device and a dynamically loadable svr4 emulator; the /usr/sbin/svr4 -# script understands that it doesn't need to load the `streams' module under -# those circumstances. -# Caveat: At this time, `options KTRACE' is required for the svr4 emulator -# (whether static or dynamic). -# -options COMPAT_SVR4 # build emulator statically -options DEBUG_SVR4 # enable verbose debugging -device streams # STREAMS network driver (required for svr4). - - -##################################################################### -# VM OPTIONS - -# Disable the 4 MByte page PSE CPU feature. The PSE feature allows the -# kernel to use 4 MByte pages to map the kernel instead of 4k pages. -# This saves on the amount of memory needed for page tables needed to -# map the kernel. You should only disable this feature as a temporary -# workaround if you are having problems with it enabled. -# -#options DISABLE_PSE - -# Disable the global pages PGE CPU feature. The PGE feature allows pages -# to be marked with the PG_G bit. TLB entries for these pages are not -# flushed from the cache when %cr3 is reloaded. This can make context -# switches less expensive. You should only disable this feature as a -# temporary workaround if you are having problems with it enabled. -# -#options DISABLE_PG_G - -# KSTACK_PAGES is the number of memory pages to assign to the kernel -# stack of each thread. - -options KSTACK_PAGES=3 - -##################################################################### - -# More undocumented options for linting. -# Note that documenting these are not considered an affront. - -options FB_INSTALL_CDEV # install a CDEV entry in /dev - -options I586_PMC_GUPROF=0x70000 -options KBDIO_DEBUG=2 -options KBD_MAXRETRY=4 -options KBD_MAXWAIT=6 -options KBD_RESETDELAY=201 - -options TIMER_FREQ=((14318182+6)/12) - -options VM_KMEM_SIZE -options VM_KMEM_SIZE_MAX -options VM_KMEM_SIZE_SCALE - - -##################################################################### -# Devices we don't want to deal with - -nodevice bt -nodevice adw -nodevice aha -nodevice ahb -nodevice ahd -nodevice mpt -nodevice trm -nodevice dpt -nodevice ciss -nodevice iir -nodevice mly -nodevice ida # Compaq Smart RAID -nodevice mlx # Mylex DAC960 -nodevice amr # AMI MegaRAID -nodevice twe # 3ware ATA RAID -nodevice cm -nodevice ex -nodevice fea -nodevice intpm -nodevice alpm -nodevice ichsmb -nodevice viapm -nodevice amdpm -nodevice amdsmb -nodevice nfpm -nodevice nfsmb - - -##################################################################### -# Options we don't want to deal with - -nooption AHD_DEBUG -nooption AHD_DEBUG_OPTS -nooption AHD_REG_PRETTY_PRINT -nooption ADW_ALLOW_MEMIO -nooption DPT_LOST_IRQ -nooption DPT_RESET_HBA -nooption DPT_TIMEOUT_FACTOR -nooption AAC_DEBUG - - -##################################################################### -# Make options we don't want to deal with diff --git a/sys/pc98/include/_align.h b/sys/pc98/include/_align.h deleted file mode 100644 index 28c4669ad258..000000000000 --- a/sys/pc98/include/_align.h +++ /dev/null @@ -1,6 +0,0 @@ -/*- - * This file is in the public domain. - */ -/* $FreeBSD$ */ - -#include <x86/_align.h> diff --git a/sys/pc98/include/_bus.h b/sys/pc98/include/_bus.h deleted file mode 100644 index 8070792dffc9..000000000000 --- a/sys/pc98/include/_bus.h +++ /dev/null @@ -1,43 +0,0 @@ -/*- - * Copyright (c) 2005 M. Warner Losh. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions, and the following disclaimer, - * without modification, immediately at the beginning of the file. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * $FreeBSD$ - */ - -#ifndef PC98_INCLUDE__BUS_H -#define PC98_INCLUDE__BUS_H - -/* - * Bus address and size types - */ -typedef u_int bus_addr_t; -typedef u_int bus_size_t; - -typedef struct bus_space_tag *bus_space_tag_t; -typedef struct bus_space_handle *bus_space_handle_t; - -#endif /* PC98_INCLUDE__BUS_H */ diff --git a/sys/pc98/include/_inttypes.h b/sys/pc98/include/_inttypes.h deleted file mode 100644 index 40107cd74a71..000000000000 --- a/sys/pc98/include/_inttypes.h +++ /dev/null @@ -1,6 +0,0 @@ -/*- - * This file is in the public domain. - */ -/* $FreeBSD$ */ - -#include <x86/_inttypes.h> diff --git a/sys/pc98/include/_limits.h b/sys/pc98/include/_limits.h deleted file mode 100644 index 3c7365bb4ed1..000000000000 --- a/sys/pc98/include/_limits.h +++ /dev/null @@ -1,6 +0,0 @@ -/*- - * This file is in the public domain. - */ -/* $FreeBSD$ */ - -#include <x86/_limits.h> diff --git a/sys/pc98/include/_stdint.h b/sys/pc98/include/_stdint.h deleted file mode 100644 index db1affc0770c..000000000000 --- a/sys/pc98/include/_stdint.h +++ /dev/null @@ -1,6 +0,0 @@ -/*- - * This file is in the public domain. - */ -/* $FreeBSD$ */ - -#include <x86/_stdint.h> diff --git a/sys/pc98/include/_types.h b/sys/pc98/include/_types.h deleted file mode 100644 index 26803672ff6f..000000000000 --- a/sys/pc98/include/_types.h +++ /dev/null @@ -1,6 +0,0 @@ -/*- - * This file is in the public domain. - */ -/* $FreeBSD$ */ - -#include <x86/_types.h> diff --git a/sys/pc98/include/apm_bios.h b/sys/pc98/include/apm_bios.h deleted file mode 100644 index 77d99c19bf40..000000000000 --- a/sys/pc98/include/apm_bios.h +++ /dev/null @@ -1,55 +0,0 @@ -/*- - * Copyright (C) 2005 M. Warner Losh. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * $FreeBSD$ - */ - -#ifndef _PC98_INCLUDE_APM_BIOS_H_ -#define _PC98_INCLUDE_APM_BIOS_H_ - -/* - * PC98 machines implement APM bios in nearly the same was as i386 machines, - * so include the i386 version and note the changes here. - */ -#include <x86/apm_bios.h> - -/* - * APM BIOS and interrupt are different on pc98 - */ -#undef APM_BIOS -#undef APM_INT -#define APM_BIOS 0x9a -#define APM_INT 0x1f - - -/* - * PC98 also has different GETPWSTATUS and DRVVERSION calls. I believe that - * these only work on newer APM BIOSes, but haven't confirmed that recently - */ -#undef APM_GETPWSTATUS -#undef APM_DRVVERSION -#define APM_GETPWSTATUS 0x3a -#define APM_DRVVERSION 0x3e - -#endif /* ! _PC98_INCLUDE_APM_BIOS_H_ */ diff --git a/sys/pc98/include/apm_segments.h b/sys/pc98/include/apm_segments.h deleted file mode 100644 index fac544b04273..000000000000 --- a/sys/pc98/include/apm_segments.h +++ /dev/null @@ -1,6 +0,0 @@ -/*- - * This file is in the public domain. - */ -/* $FreeBSD$ */ - -#include <i386/apm_segments.h> diff --git a/sys/pc98/include/asm.h b/sys/pc98/include/asm.h deleted file mode 100644 index aa141634f7de..000000000000 --- a/sys/pc98/include/asm.h +++ /dev/null @@ -1,6 +0,0 @@ -/*- - * This file is in the public domain. - */ -/* $FreeBSD$ */ - -#include <i386/asm.h> diff --git a/sys/pc98/include/asmacros.h b/sys/pc98/include/asmacros.h deleted file mode 100644 index 98f3839356bf..000000000000 --- a/sys/pc98/include/asmacros.h +++ /dev/null @@ -1,6 +0,0 @@ -/*- - * This file is in the public domain. - */ -/* $FreeBSD$ */ - -#include <i386/asmacros.h> diff --git a/sys/pc98/include/atomic.h b/sys/pc98/include/atomic.h deleted file mode 100644 index e6550e4bc6ec..000000000000 --- a/sys/pc98/include/atomic.h +++ /dev/null @@ -1,6 +0,0 @@ -/*- - * This file is in the public domain. - */ -/* $FreeBSD$ */ - -#include <i386/atomic.h> diff --git a/sys/pc98/include/bootinfo.h b/sys/pc98/include/bootinfo.h deleted file mode 100644 index c627e432227a..000000000000 --- a/sys/pc98/include/bootinfo.h +++ /dev/null @@ -1,6 +0,0 @@ -/*- - * This file is in the public domain. - */ -/* $FreeBSD$ */ - -#include <i386/bootinfo.h> diff --git a/sys/pc98/include/bus.h b/sys/pc98/include/bus.h deleted file mode 100644 index 206041410f75..000000000000 --- a/sys/pc98/include/bus.h +++ /dev/null @@ -1,648 +0,0 @@ -/*- - * Copyright (c) KATO Takenori, 1999. - * - * All rights reserved. Unpublished rights reserved under the copyright - * laws of Japan. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer as - * the first lines of this file unmodified. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD$ - */ - -/* $NecBSD: busio.h,v 3.25.4.2.2.1 2000/06/12 03:53:08 honda Exp $ */ -/* $NetBSD: bus.h,v 1.12 1997/10/01 08:25:15 fvdl Exp $ */ - -/*- - * [NetBSD for NEC PC-98 series] - * Copyright (c) 1997, 1998 - * NetBSD/pc98 porting staff. All rights reserved. - * - * [Ported for FreeBSD] - * Copyright (c) 2001 - * TAKAHASHI Yoshihiro. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -/* - * Copyright (c) 1997, 1998 - * Naofumi HONDA. All rights reserved. - * - * This module support generic bus address relocation mechanism. - * To reduce a function call overhead, we employ pascal call methods. - */ - -#ifndef _PC98_BUS_H_ -#define _PC98_BUS_H_ - -#ifdef _KERNEL -#include <sys/systm.h> -#endif /* _KERNEL */ - -#include <machine/_bus.h> -#include <machine/cpufunc.h> - -#define BUS_SPACE_MAXSIZE_24BIT 0xFFFFFF -#define BUS_SPACE_MAXSIZE_32BIT 0xFFFFFFFF -#define BUS_SPACE_MAXSIZE 0xFFFFFFFF -#define BUS_SPACE_MAXADDR_24BIT 0xFFFFFF -#define BUS_SPACE_MAXADDR_32BIT 0xFFFFFFFF -#define BUS_SPACE_MAXADDR 0xFFFFFFFF - -#define BUS_SPACE_UNRESTRICTED (~0) - -#ifdef _KERNEL - -/* - * address relocation table - */ -#define BUS_SPACE_IAT_MAXSIZE 33 -typedef bus_addr_t *bus_space_iat_t; - -#define BUS_SPACE_IAT_SZ(IOTARRAY) (sizeof(IOTARRAY)/sizeof(bus_addr_t)) - -/* - * Access methods for bus resources and address space. - */ -struct resource; - -/* - * bus space tag - */ -#define _PASCAL_CALL (void) - -#define _BUS_SPACE_CALL_FUNCS_TAB(NAME,TYPE,BWN) \ - NAME##_space_read_##BWN, \ - NAME##_space_read_multi_##BWN, \ - NAME##_space_read_region_##BWN, \ - NAME##_space_write_##BWN, \ - NAME##_space_write_multi_##BWN, \ - NAME##_space_write_region_##BWN, \ - NAME##_space_set_multi_##BWN, \ - NAME##_space_set_region_##BWN, \ - NAME##_space_copy_region_##BWN - -#define _BUS_SPACE_CALL_FUNCS_PROTO(NAME,TYPE,BWN) \ - TYPE NAME##_space_read_##BWN _PASCAL_CALL; \ - void NAME##_space_read_multi_##BWN _PASCAL_CALL; \ - void NAME##_space_read_region_##BWN _PASCAL_CALL; \ - void NAME##_space_write_##BWN _PASCAL_CALL; \ - void NAME##_space_write_multi_##BWN _PASCAL_CALL; \ - void NAME##_space_write_region_##BWN _PASCAL_CALL; \ - void NAME##_space_set_multi_##BWN _PASCAL_CALL; \ - void NAME##_space_set_region_##BWN _PASCAL_CALL; \ - void NAME##_space_copy_region_##BWN _PASCAL_CALL; - -#define _BUS_SPACE_CALL_FUNCS(NAME,TYPE,BWN) \ - TYPE (* NAME##_read_##BWN) _PASCAL_CALL; \ - void (* NAME##_read_multi_##BWN) _PASCAL_CALL; \ - void (* NAME##_read_region_##BWN) _PASCAL_CALL; \ - void (* NAME##_write_##BWN) _PASCAL_CALL; \ - void (* NAME##_write_multi_##BWN) _PASCAL_CALL; \ - void (* NAME##_write_region_##BWN) _PASCAL_CALL; \ - void (* NAME##_set_multi_##BWN) _PASCAL_CALL; \ - void (* NAME##_set_region_##BWN) _PASCAL_CALL; \ - void (* NAME##_copy_region_##BWN) _PASCAL_CALL; - -struct bus_space_access_methods { - /* 8 bits access methods */ - _BUS_SPACE_CALL_FUNCS(bs,u_int8_t,1) - - /* 16 bits access methods */ - _BUS_SPACE_CALL_FUNCS(bs,u_int16_t,2) - - /* 32 bits access methods */ - _BUS_SPACE_CALL_FUNCS(bs,u_int32_t,4) -}; - -/* - * Access methods for bus resources and address space. - */ -struct bus_space_tag { -#define BUS_SPACE_TAG_IO 0 -#define BUS_SPACE_TAG_MEM 1 - u_int bs_tag; /* bus space flags */ - - struct bus_space_access_methods bs_da; /* direct access */ - struct bus_space_access_methods bs_ra; /* relocate access */ -#if 0 - struct bus_space_access_methods bs_ida; /* indexed direct access */ -#endif -}; - -/* - * bus space handle - */ -struct bus_space_handle { - bus_addr_t bsh_base; - size_t bsh_sz; - - bus_addr_t bsh_iat[BUS_SPACE_IAT_MAXSIZE]; - size_t bsh_maxiatsz; - size_t bsh_iatsz; - - struct resource **bsh_res; - size_t bsh_ressz; - - struct bus_space_access_methods bsh_bam; -}; - -/* - * Values for the pc98 bus space tag, not to be used directly by MI code. - */ -extern struct bus_space_tag SBUS_io_space_tag; -extern struct bus_space_tag SBUS_mem_space_tag; - -#define X86_BUS_SPACE_IO (&SBUS_io_space_tag) -#define X86_BUS_SPACE_MEM (&SBUS_mem_space_tag) - -/* - * Allocate/Free bus_space_handle - */ -int i386_bus_space_handle_alloc(bus_space_tag_t t, bus_addr_t bpa, - bus_size_t size, bus_space_handle_t *bshp); -void i386_bus_space_handle_free(bus_space_tag_t t, bus_space_handle_t bsh, - size_t size); - -/* - * int bus_space_map (bus_space_tag_t t, bus_addr_t addr, - * bus_size_t size, int flag, bus_space_handle_t *bshp); - * - * Map a region of bus space. - */ - -int i386_memio_map(bus_space_tag_t t, bus_addr_t addr, bus_size_t size, - int flag, bus_space_handle_t *bshp); - -#define bus_space_map(t, a, s, f, hp) \ - i386_memio_map((t), (a), (s), (f), (hp)) - -/* - * int bus_space_unmap (bus_space_tag_t t, - * bus_space_handle_t bsh, bus_size_t size); - * - * Unmap a region of bus space. - */ - -void i386_memio_unmap(bus_space_tag_t t, bus_space_handle_t bsh, - bus_size_t size); - -#define bus_space_unmap(t, h, s) \ - i386_memio_unmap((t), (h), (s)) - -/* - * int bus_space_map_load (bus_space_tag_t t, bus_space_handle_t bsh, - * bus_size_t size, bus_space_iat_t iat, u_int flags); - * - * Load I/O address table of bus space. - */ - -int i386_memio_map_load(bus_space_tag_t t, bus_space_handle_t bsh, - bus_size_t size, bus_space_iat_t iat, u_int flags); - -#define bus_space_map_load(t, h, s, iat, f) \ - i386_memio_map_load((t), (h), (s), (iat), (f)) - -/* - * int bus_space_subregion (bus_space_tag_t t, - * bus_space_handle_t bsh, bus_size_t offset, bus_size_t size, - * bus_space_handle_t *nbshp); - * - * Get a new handle for a subregion of an already-mapped area of bus space. - */ - -int i386_memio_subregion(bus_space_tag_t t, bus_space_handle_t bsh, - bus_size_t offset, bus_size_t size, - bus_space_handle_t *nbshp); - -#define bus_space_subregion(t, h, o, s, nhp) \ - i386_memio_subregion((t), (h), (o), (s), (nhp)) - -/* - * int bus_space_free (bus_space_tag_t t, - * bus_space_handle_t bsh, bus_size_t size); - * - * Free a region of bus space. - */ - -void i386_memio_free(bus_space_tag_t t, bus_space_handle_t bsh, - bus_size_t size); - -#define bus_space_free(t, h, s) \ - i386_memio_free((t), (h), (s)) - -/* - * int bus_space_compare (bus_space_tag_t t1, bus_space_handle_t bsh1, - * bus_space_tag_t t2, bus_space_handle_t bsh2); - * - * Compare two resources. - */ -int i386_memio_compare(bus_space_tag_t t1, bus_space_handle_t bsh1, - bus_space_tag_t t2, bus_space_handle_t bsh2); - -#define bus_space_compare(t1, h1, t2, h2) \ - i386_memio_compare((t1), (h1), (t2), (h2)) - -/* - * Access methods for bus resources and address space. - */ -#define _BUS_ACCESS_METHODS_PROTO(TYPE,BWN) \ - static __inline TYPE bus_space_read_##BWN \ - (bus_space_tag_t, bus_space_handle_t, bus_size_t offset); \ - static __inline void bus_space_read_multi_##BWN \ - (bus_space_tag_t, bus_space_handle_t, \ - bus_size_t, TYPE *, size_t); \ - static __inline void bus_space_read_region_##BWN \ - (bus_space_tag_t, bus_space_handle_t, \ - bus_size_t, TYPE *, size_t); \ - static __inline void bus_space_write_##BWN \ - (bus_space_tag_t, bus_space_handle_t, bus_size_t, TYPE); \ - static __inline void bus_space_write_multi_##BWN \ - (bus_space_tag_t, bus_space_handle_t, \ - bus_size_t, const TYPE *, size_t); \ - static __inline void bus_space_write_region_##BWN \ - (bus_space_tag_t, bus_space_handle_t, \ - bus_size_t, const TYPE *, size_t); \ - static __inline void bus_space_set_multi_##BWN \ - (bus_space_tag_t, bus_space_handle_t, bus_size_t, TYPE, size_t);\ - static __inline void bus_space_set_region_##BWN \ - (bus_space_tag_t, bus_space_handle_t, bus_size_t, TYPE, size_t);\ - static __inline void bus_space_copy_region_##BWN \ - (bus_space_tag_t, bus_space_handle_t, bus_size_t, \ - bus_space_handle_t, bus_size_t, size_t); - -_BUS_ACCESS_METHODS_PROTO(u_int8_t,1) -_BUS_ACCESS_METHODS_PROTO(u_int16_t,2) -_BUS_ACCESS_METHODS_PROTO(u_int32_t,4) - -/* - * read methods - */ -#define _BUS_SPACE_READ(TYPE,BWN) \ -static __inline TYPE \ -bus_space_read_##BWN (bus_space_tag_t tag, bus_space_handle_t bsh, \ - bus_size_t offset) \ -{ \ - register TYPE result; \ - \ - __asm __volatile("call *%2" \ - :"=a" (result), \ - "=d" (offset) \ - :"o" (bsh->bsh_bam.bs_read_##BWN), \ - "b" (bsh), \ - "1" (offset) \ - ); \ - \ - return result; \ -} - -_BUS_SPACE_READ(u_int8_t,1) -_BUS_SPACE_READ(u_int16_t,2) -_BUS_SPACE_READ(u_int32_t,4) - -/* - * write methods - */ -#define _BUS_SPACE_WRITE(TYPE,BWN) \ -static __inline void \ -bus_space_write_##BWN (bus_space_tag_t tag, bus_space_handle_t bsh, \ - bus_size_t offset, TYPE val) \ -{ \ - \ - __asm __volatile("call *%1" \ - :"=d" (offset) \ - :"o" (bsh->bsh_bam.bs_write_##BWN), \ - "a" (val), \ - "b" (bsh), \ - "0" (offset) \ - ); \ -} - -_BUS_SPACE_WRITE(u_int8_t,1) -_BUS_SPACE_WRITE(u_int16_t,2) -_BUS_SPACE_WRITE(u_int32_t,4) - -/* - * multi read - */ -#define _BUS_SPACE_READ_MULTI(TYPE,BWN) \ -static __inline void \ -bus_space_read_multi_##BWN (bus_space_tag_t tag, bus_space_handle_t bsh, \ - bus_size_t offset, TYPE *buf, size_t cnt) \ -{ \ - \ - __asm __volatile("call *%3" \ - :"=c" (cnt), \ - "=d" (offset), \ - "=D" (buf) \ - :"o" (bsh->bsh_bam.bs_read_multi_##BWN), \ - "b" (bsh), \ - "0" (cnt), \ - "1" (offset), \ - "2" (buf) \ - :"memory"); \ -} - -_BUS_SPACE_READ_MULTI(u_int8_t,1) -_BUS_SPACE_READ_MULTI(u_int16_t,2) -_BUS_SPACE_READ_MULTI(u_int32_t,4) - -/* - * multi write - */ -#define _BUS_SPACE_WRITE_MULTI(TYPE,BWN) \ -static __inline void \ -bus_space_write_multi_##BWN (bus_space_tag_t tag, bus_space_handle_t bsh, \ - bus_size_t offset, const TYPE *buf, size_t cnt) \ -{ \ - \ - __asm __volatile("call *%3" \ - :"=c" (cnt), \ - "=d" (offset), \ - "=S" (buf) \ - :"o" (bsh->bsh_bam.bs_write_multi_##BWN), \ - "b" (bsh), \ - "0" (cnt), \ - "1" (offset), \ - "2" (buf) \ - ); \ -} - -_BUS_SPACE_WRITE_MULTI(u_int8_t,1) -_BUS_SPACE_WRITE_MULTI(u_int16_t,2) -_BUS_SPACE_WRITE_MULTI(u_int32_t,4) - -/* - * region read - */ -#define _BUS_SPACE_READ_REGION(TYPE,BWN) \ -static __inline void \ -bus_space_read_region_##BWN (bus_space_tag_t tag, bus_space_handle_t bsh, \ - bus_size_t offset, TYPE *buf, size_t cnt) \ -{ \ - \ - __asm __volatile("call *%3" \ - :"=c" (cnt), \ - "=d" (offset), \ - "=D" (buf) \ - :"o" (bsh->bsh_bam.bs_read_region_##BWN), \ - "b" (bsh), \ - "0" (cnt), \ - "1" (offset), \ - "2" (buf) \ - :"memory"); \ -} - -_BUS_SPACE_READ_REGION(u_int8_t,1) -_BUS_SPACE_READ_REGION(u_int16_t,2) -_BUS_SPACE_READ_REGION(u_int32_t,4) - -/* - * region write - */ -#define _BUS_SPACE_WRITE_REGION(TYPE,BWN) \ -static __inline void \ -bus_space_write_region_##BWN (bus_space_tag_t tag, bus_space_handle_t bsh, \ - bus_size_t offset, const TYPE *buf, size_t cnt) \ -{ \ - \ - __asm __volatile("call *%3" \ - :"=c" (cnt), \ - "=d" (offset), \ - "=S" (buf) \ - :"o" (bsh->bsh_bam.bs_write_region_##BWN), \ - "b" (bsh), \ - "0" (cnt), \ - "1" (offset), \ - "2" (buf) \ - ); \ -} - -_BUS_SPACE_WRITE_REGION(u_int8_t,1) -_BUS_SPACE_WRITE_REGION(u_int16_t,2) -_BUS_SPACE_WRITE_REGION(u_int32_t,4) - -/* - * multi set - */ -#define _BUS_SPACE_SET_MULTI(TYPE,BWN) \ -static __inline void \ -bus_space_set_multi_##BWN (bus_space_tag_t tag, bus_space_handle_t bsh, \ - bus_size_t offset, TYPE val, size_t cnt) \ -{ \ - \ - __asm __volatile("call *%2" \ - :"=c" (cnt), \ - "=d" (offset) \ - :"o" (bsh->bsh_bam.bs_set_multi_##BWN), \ - "a" (val), \ - "b" (bsh), \ - "0" (cnt), \ - "1" (offset) \ - ); \ -} - -_BUS_SPACE_SET_MULTI(u_int8_t,1) -_BUS_SPACE_SET_MULTI(u_int16_t,2) -_BUS_SPACE_SET_MULTI(u_int32_t,4) - -/* - * region set - */ -#define _BUS_SPACE_SET_REGION(TYPE,BWN) \ -static __inline void \ -bus_space_set_region_##BWN (bus_space_tag_t tag, bus_space_handle_t bsh, \ - bus_size_t offset, TYPE val, size_t cnt) \ -{ \ - \ - __asm __volatile("call *%2" \ - :"=c" (cnt), \ - "=d" (offset) \ - :"o" (bsh->bsh_bam.bs_set_region_##BWN), \ - "a" (val), \ - "b" (bsh), \ - "0" (cnt), \ - "1" (offset) \ - ); \ -} - -_BUS_SPACE_SET_REGION(u_int8_t,1) -_BUS_SPACE_SET_REGION(u_int16_t,2) -_BUS_SPACE_SET_REGION(u_int32_t,4) - -/* - * copy - */ -#define _BUS_SPACE_COPY_REGION(BWN) \ -static __inline void \ -bus_space_copy_region_##BWN (bus_space_tag_t tag, bus_space_handle_t sbsh, \ - bus_size_t src, bus_space_handle_t dbsh, bus_size_t dst, size_t cnt) \ -{ \ - \ - if (dbsh->bsh_bam.bs_copy_region_1 != sbsh->bsh_bam.bs_copy_region_1) \ - panic("bus_space_copy_region: funcs mismatch (ENOSUPPORT)");\ - \ - __asm __volatile("call *%3" \ - :"=c" (cnt), \ - "=S" (src), \ - "=D" (dst) \ - :"o" (dbsh->bsh_bam.bs_copy_region_##BWN), \ - "a" (sbsh), \ - "b" (dbsh), \ - "0" (cnt), \ - "1" (src), \ - "2" (dst) \ - ); \ -} - -_BUS_SPACE_COPY_REGION(1) -_BUS_SPACE_COPY_REGION(2) -_BUS_SPACE_COPY_REGION(4) - -/* - * Bus read/write barrier methods. - * - * void bus_space_barrier(bus_space_tag_t tag, bus_space_handle_t bsh, - * bus_size_t offset, bus_size_t len, int flags); - * - * - * Note that BUS_SPACE_BARRIER_WRITE doesn't do anything other than - * prevent reordering by the compiler; all Intel x86 processors currently - * retire operations outside the CPU in program order. - */ -#define BUS_SPACE_BARRIER_READ 0x01 /* force read barrier */ -#define BUS_SPACE_BARRIER_WRITE 0x02 /* force write barrier */ - -static __inline void -bus_space_barrier(bus_space_tag_t tag, bus_space_handle_t bsh, - bus_size_t offset, bus_size_t len, int flags) -{ - if (flags & BUS_SPACE_BARRIER_READ) - __asm __volatile("lock; addl $0,0(%%esp)" : : : "memory"); - else - __compiler_membar(); -} - -#ifdef BUS_SPACE_NO_LEGACY -#undef inb -#undef outb -#define inb(a) compiler_error -#define inw(a) compiler_error -#define inl(a) compiler_error -#define outb(a, b) compiler_error -#define outw(a, b) compiler_error -#define outl(a, b) compiler_error -#endif - -#include <machine/bus_dma.h> - -/* - * Stream accesses are the same as normal accesses on i386/pc98; there are no - * supported bus systems with an endianess different from the host one. - */ -#define bus_space_read_stream_1(t, h, o) bus_space_read_1((t), (h), (o)) -#define bus_space_read_stream_2(t, h, o) bus_space_read_2((t), (h), (o)) -#define bus_space_read_stream_4(t, h, o) bus_space_read_4((t), (h), (o)) - -#define bus_space_read_multi_stream_1(t, h, o, a, c) \ - bus_space_read_multi_1((t), (h), (o), (a), (c)) -#define bus_space_read_multi_stream_2(t, h, o, a, c) \ - bus_space_read_multi_2((t), (h), (o), (a), (c)) -#define bus_space_read_multi_stream_4(t, h, o, a, c) \ - bus_space_read_multi_4((t), (h), (o), (a), (c)) - -#define bus_space_write_stream_1(t, h, o, v) \ - bus_space_write_1((t), (h), (o), (v)) -#define bus_space_write_stream_2(t, h, o, v) \ - bus_space_write_2((t), (h), (o), (v)) -#define bus_space_write_stream_4(t, h, o, v) \ - bus_space_write_4((t), (h), (o), (v)) - -#define bus_space_write_multi_stream_1(t, h, o, a, c) \ - bus_space_write_multi_1((t), (h), (o), (a), (c)) -#define bus_space_write_multi_stream_2(t, h, o, a, c) \ - bus_space_write_multi_2((t), (h), (o), (a), (c)) -#define bus_space_write_multi_stream_4(t, h, o, a, c) \ - bus_space_write_multi_4((t), (h), (o), (a), (c)) - -#define bus_space_set_multi_stream_1(t, h, o, v, c) \ - bus_space_set_multi_1((t), (h), (o), (v), (c)) -#define bus_space_set_multi_stream_2(t, h, o, v, c) \ - bus_space_set_multi_2((t), (h), (o), (v), (c)) -#define bus_space_set_multi_stream_4(t, h, o, v, c) \ - bus_space_set_multi_4((t), (h), (o), (v), (c)) - -#define bus_space_read_region_stream_1(t, h, o, a, c) \ - bus_space_read_region_1((t), (h), (o), (a), (c)) -#define bus_space_read_region_stream_2(t, h, o, a, c) \ - bus_space_read_region_2((t), (h), (o), (a), (c)) -#define bus_space_read_region_stream_4(t, h, o, a, c) \ - bus_space_read_region_4((t), (h), (o), (a), (c)) - -#define bus_space_write_region_stream_1(t, h, o, a, c) \ - bus_space_write_region_1((t), (h), (o), (a), (c)) -#define bus_space_write_region_stream_2(t, h, o, a, c) \ - bus_space_write_region_2((t), (h), (o), (a), (c)) -#define bus_space_write_region_stream_4(t, h, o, a, c) \ - bus_space_write_region_4((t), (h), (o), (a), (c)) - -#define bus_space_set_region_stream_1(t, h, o, v, c) \ - bus_space_set_region_1((t), (h), (o), (v), (c)) -#define bus_space_set_region_stream_2(t, h, o, v, c) \ - bus_space_set_region_2((t), (h), (o), (v), (c)) -#define bus_space_set_region_stream_4(t, h, o, v, c) \ - bus_space_set_region_4((t), (h), (o), (v), (c)) - -#define bus_space_copy_region_stream_1(t, h1, o1, h2, o2, c) \ - bus_space_copy_region_1((t), (h1), (o1), (h2), (o2), (c)) -#define bus_space_copy_region_stream_2(t, h1, o1, h2, o2, c) \ - bus_space_copy_region_2((t), (h1), (o1), (h2), (o2), (c)) -#define bus_space_copy_region_stream_4(t, h1, o1, h2, o2, c) \ - bus_space_copy_region_4((t), (h1), (o1), (h2), (o2), (c)) - -#endif /* _KERNEL */ - -#endif /* _PC98_BUS_H_ */ diff --git a/sys/pc98/include/bus_dma.h b/sys/pc98/include/bus_dma.h deleted file mode 100644 index 4fdad3f5a787..000000000000 --- a/sys/pc98/include/bus_dma.h +++ /dev/null @@ -1,6 +0,0 @@ -/*- - * This file is in the public domain. - */ -/* $FreeBSD$ */ - -#include <i386/bus_dma.h> diff --git a/sys/pc98/include/clock.h b/sys/pc98/include/clock.h deleted file mode 100644 index 9c9ff18a384f..000000000000 --- a/sys/pc98/include/clock.h +++ /dev/null @@ -1,6 +0,0 @@ -/*- - * This file is in the public domain. - */ -/* $FreeBSD$ */ - -#include <i386/clock.h> diff --git a/sys/pc98/include/counter.h b/sys/pc98/include/counter.h deleted file mode 100644 index 7b2bbad168c2..000000000000 --- a/sys/pc98/include/counter.h +++ /dev/null @@ -1,6 +0,0 @@ -/*- - * This file is in the public domain. - */ -/* $FreeBSD$ */ - -#include <i386/counter.h> diff --git a/sys/pc98/include/cpu.h b/sys/pc98/include/cpu.h deleted file mode 100644 index 6da74edee9a6..000000000000 --- a/sys/pc98/include/cpu.h +++ /dev/null @@ -1,6 +0,0 @@ -/*- - * This file is in the public domain. - */ -/* $FreeBSD$ */ - -#include <i386/cpu.h> diff --git a/sys/pc98/include/cpufunc.h b/sys/pc98/include/cpufunc.h deleted file mode 100644 index deb0c39b3800..000000000000 --- a/sys/pc98/include/cpufunc.h +++ /dev/null @@ -1,6 +0,0 @@ -/*- - * This file is in the public domain. - */ -/* $FreeBSD$ */ - -#include <i386/cpufunc.h> diff --git a/sys/pc98/include/cputypes.h b/sys/pc98/include/cputypes.h deleted file mode 100644 index dbea880f7064..000000000000 --- a/sys/pc98/include/cputypes.h +++ /dev/null @@ -1,6 +0,0 @@ -/*- - * This file is in the public domain. - */ -/* $FreeBSD$ */ - -#include <i386/cputypes.h> diff --git a/sys/pc98/include/cserial.h b/sys/pc98/include/cserial.h deleted file mode 100644 index c7fc61094299..000000000000 --- a/sys/pc98/include/cserial.h +++ /dev/null @@ -1,6 +0,0 @@ -/*- - * This file is in the public domain. - */ -/* $FreeBSD$ */ - -#include <i386/cserial.h> diff --git a/sys/pc98/include/db_machdep.h b/sys/pc98/include/db_machdep.h deleted file mode 100644 index a1b0c147664f..000000000000 --- a/sys/pc98/include/db_machdep.h +++ /dev/null @@ -1,6 +0,0 @@ -/*- - * This file is in the public domain. - */ -/* $FreeBSD$ */ - -#include <i386/db_machdep.h> diff --git a/sys/pc98/include/dump.h b/sys/pc98/include/dump.h deleted file mode 100644 index 815942d0d967..000000000000 --- a/sys/pc98/include/dump.h +++ /dev/null @@ -1,6 +0,0 @@ -/*- - * This file is in the public domain. - */ -/* $FreeBSD$ */ - -#include <x86/dump.h> diff --git a/sys/pc98/include/efi.h b/sys/pc98/include/efi.h deleted file mode 100644 index 71d5728e7a85..000000000000 --- a/sys/pc98/include/efi.h +++ /dev/null @@ -1,14 +0,0 @@ -/*- - * This file is in the public domain since it's just boilerplate. - * - * $FreeBSD$ - */ - -#ifndef __PC98_INCLUDE_EFI_H_ -#define __PC98_INCLUDE_EFI_H_ - -#define EFIABI_ATTR - -/* Note: we don't actually support this on pc98 */ - -#endif /* __PC98_INCLUDE_EFI_H_ */ diff --git a/sys/pc98/include/elf.h b/sys/pc98/include/elf.h deleted file mode 100644 index 39937596f169..000000000000 --- a/sys/pc98/include/elf.h +++ /dev/null @@ -1,6 +0,0 @@ -/*- - * This file is in the public domain. - */ -/* $FreeBSD$ */ - -#include <i386/elf.h> diff --git a/sys/pc98/include/endian.h b/sys/pc98/include/endian.h deleted file mode 100644 index 2ad27a9069b9..000000000000 --- a/sys/pc98/include/endian.h +++ /dev/null @@ -1,6 +0,0 @@ -/*- - * This file is in the public domain. - */ -/* $FreeBSD$ */ - -#include <x86/endian.h> diff --git a/sys/pc98/include/exec.h b/sys/pc98/include/exec.h deleted file mode 100644 index e86bada4aaa0..000000000000 --- a/sys/pc98/include/exec.h +++ /dev/null @@ -1,6 +0,0 @@ -/*- - * This file is in the public domain. - */ -/* $FreeBSD$ */ - -#include <i386/exec.h> diff --git a/sys/pc98/include/float.h b/sys/pc98/include/float.h deleted file mode 100644 index 4759963566ab..000000000000 --- a/sys/pc98/include/float.h +++ /dev/null @@ -1,6 +0,0 @@ -/*- - * This file is in the public domain. - */ -/* $FreeBSD$ */ - -#include <x86/float.h> diff --git a/sys/pc98/include/floatingpoint.h b/sys/pc98/include/floatingpoint.h deleted file mode 100644 index c61de43cd1ae..000000000000 --- a/sys/pc98/include/floatingpoint.h +++ /dev/null @@ -1,6 +0,0 @@ -/*- - * This file is in the public domain. - */ -/* $FreeBSD$ */ - -#include <i386/floatingpoint.h> diff --git a/sys/pc98/include/frame.h b/sys/pc98/include/frame.h deleted file mode 100644 index 89d90c053215..000000000000 --- a/sys/pc98/include/frame.h +++ /dev/null @@ -1,6 +0,0 @@ -/*- - * This file is in the public domain. - */ -/* $FreeBSD$ */ - -#include <i386/frame.h> diff --git a/sys/pc98/include/gdb_machdep.h b/sys/pc98/include/gdb_machdep.h deleted file mode 100644 index dcb25bb3faff..000000000000 --- a/sys/pc98/include/gdb_machdep.h +++ /dev/null @@ -1,6 +0,0 @@ -/*- - * This file is in the public domain. - */ -/* $FreeBSD$ */ - -#include <i386/gdb_machdep.h> diff --git a/sys/pc98/include/ieeefp.h b/sys/pc98/include/ieeefp.h deleted file mode 100644 index 67f0c099406e..000000000000 --- a/sys/pc98/include/ieeefp.h +++ /dev/null @@ -1,6 +0,0 @@ -/*- - * This file is in the public domain. - */ -/* $FreeBSD$ */ - -#include <i386/ieeefp.h> diff --git a/sys/pc98/include/in_cksum.h b/sys/pc98/include/in_cksum.h deleted file mode 100644 index e7227d4479df..000000000000 --- a/sys/pc98/include/in_cksum.h +++ /dev/null @@ -1,6 +0,0 @@ -/*- - * This file is in the public domain. - */ -/* $FreeBSD$ */ - -#include <i386/in_cksum.h> diff --git a/sys/pc98/include/intr_machdep.h b/sys/pc98/include/intr_machdep.h deleted file mode 100644 index 9fccf8af6742..000000000000 --- a/sys/pc98/include/intr_machdep.h +++ /dev/null @@ -1,6 +0,0 @@ -/*- - * This file is in the public domain. - */ -/* $FreeBSD$ */ - -#include <i386/intr_machdep.h> diff --git a/sys/pc98/include/ioctl_bt848.h b/sys/pc98/include/ioctl_bt848.h deleted file mode 100644 index 668fd4a3a6c1..000000000000 --- a/sys/pc98/include/ioctl_bt848.h +++ /dev/null @@ -1,6 +0,0 @@ -/*- - * This file is in the public domain. - */ -/* $FreeBSD$ */ - -#include <i386/ioctl_bt848.h> diff --git a/sys/pc98/include/ioctl_meteor.h b/sys/pc98/include/ioctl_meteor.h deleted file mode 100644 index 1a750bdd7215..000000000000 --- a/sys/pc98/include/ioctl_meteor.h +++ /dev/null @@ -1,6 +0,0 @@ -/*- - * This file is in the public domain. - */ -/* $FreeBSD$ */ - -#include <i386/ioctl_meteor.h> diff --git a/sys/pc98/include/iodev.h b/sys/pc98/include/iodev.h deleted file mode 100644 index 683ea7929264..000000000000 --- a/sys/pc98/include/iodev.h +++ /dev/null @@ -1,6 +0,0 @@ -/*- - * This file is in the public domain. - */ -/* $FreeBSD$ */ - -#include <i386/iodev.h> diff --git a/sys/pc98/include/kdb.h b/sys/pc98/include/kdb.h deleted file mode 100644 index 9d412d45d261..000000000000 --- a/sys/pc98/include/kdb.h +++ /dev/null @@ -1,6 +0,0 @@ -/*- - * This file is in the public domain. - */ -/* $FreeBSD$ */ - -#include <i386/kdb.h> diff --git a/sys/pc98/include/limits.h b/sys/pc98/include/limits.h deleted file mode 100644 index b51a993d7933..000000000000 --- a/sys/pc98/include/limits.h +++ /dev/null @@ -1,6 +0,0 @@ -/*- - * This file is in the public domain. - */ -/* $FreeBSD$ */ - -#include <i386/limits.h> diff --git a/sys/pc98/include/md_var.h b/sys/pc98/include/md_var.h deleted file mode 100644 index fe881bae0235..000000000000 --- a/sys/pc98/include/md_var.h +++ /dev/null @@ -1,51 +0,0 @@ -/*- - * Copyright (C) 2005 M. Warner Losh. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * $FreeBSD$ - */ - -#ifndef _PC98_INCLUDE_MD_VAR_H_ -#define _PC98_INCLUDE_MD_VAR_H_ - -#include <i386/md_var.h> - -/* - * PC98 machines are based on Intel CPUs. Some add-in boards offer - * different CPUs than came with the processor. These CPUs sometimes - * require additional flushing before and/or after DMAs. - */ -extern int need_pre_dma_flush; -extern int need_post_dma_flush; - -/* - * The geometry of disks might need adjustment on PC98 machines. - */ -struct ccb_calc_geometry; -int scsi_da_bios_params(struct ccb_calc_geometry *); -struct disk; -void pc98_ata_disk_firmware_geom_adjust(struct disk *); -#define ata_disk_firmware_geom_adjust(disk) \ - pc98_ata_disk_firmware_geom_adjust(disk) - -#endif /* !_PC98_INCLUDE_MD_VAR_H_ */ diff --git a/sys/pc98/include/memdev.h b/sys/pc98/include/memdev.h deleted file mode 100644 index 46e230161712..000000000000 --- a/sys/pc98/include/memdev.h +++ /dev/null @@ -1,6 +0,0 @@ -/*- - * This file is in the public domain. - */ -/* $FreeBSD$ */ - -#include <i386/memdev.h> diff --git a/sys/pc98/include/metadata.h b/sys/pc98/include/metadata.h deleted file mode 100644 index 1d783ec90591..000000000000 --- a/sys/pc98/include/metadata.h +++ /dev/null @@ -1,6 +0,0 @@ -/*- - * This file is in the public domain. - */ -/* $FreeBSD$ */ - -#include <i386/metadata.h> diff --git a/sys/pc98/include/minidump.h b/sys/pc98/include/minidump.h deleted file mode 100644 index 55c9b3176e1a..000000000000 --- a/sys/pc98/include/minidump.h +++ /dev/null @@ -1,6 +0,0 @@ -/*- - * This file is in the public domain. - */ -/* $FreeBSD$ */ - -#include <i386/minidump.h> diff --git a/sys/pc98/include/mp_watchdog.h b/sys/pc98/include/mp_watchdog.h deleted file mode 100644 index f0b91c00c4ad..000000000000 --- a/sys/pc98/include/mp_watchdog.h +++ /dev/null @@ -1,6 +0,0 @@ -/*- - * This file is in the public domain. - */ -/* $FreeBSD$ */ - -#include <i386/mp_watchdog.h> diff --git a/sys/pc98/include/nexusvar.h b/sys/pc98/include/nexusvar.h deleted file mode 100644 index 7ff6098e2352..000000000000 --- a/sys/pc98/include/nexusvar.h +++ /dev/null @@ -1,6 +0,0 @@ -/*- - * This file is in the public domain. - */ -/* $FreeBSD$ */ - -#include <i386/nexusvar.h> diff --git a/sys/pc98/include/npx.h b/sys/pc98/include/npx.h deleted file mode 100644 index 67c64027c08c..000000000000 --- a/sys/pc98/include/npx.h +++ /dev/null @@ -1,6 +0,0 @@ -/*- - * This file is in the public domain. - */ -/* $FreeBSD$ */ - -#include <i386/npx.h> diff --git a/sys/pc98/include/ofw_machdep.h b/sys/pc98/include/ofw_machdep.h deleted file mode 100644 index 196a3961471f..000000000000 --- a/sys/pc98/include/ofw_machdep.h +++ /dev/null @@ -1,6 +0,0 @@ -/*- - * This file is in the public domain. - */ -/* $FreeBSD$ */ - -#include <i386/ofw_machdep.h> diff --git a/sys/pc98/include/param.h b/sys/pc98/include/param.h deleted file mode 100644 index 2e44cf22cc5b..000000000000 --- a/sys/pc98/include/param.h +++ /dev/null @@ -1,33 +0,0 @@ -/*- - * Copyright (c) 2005 TAKAHASHI Yoshihiro. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * $FreeBSD$ - */ - -#define MACHINE "pc98" - -#include <i386/param.h> - -#undef __HAVE_ACPI diff --git a/sys/pc98/include/pc/bios.h b/sys/pc98/include/pc/bios.h deleted file mode 100644 index d804fdec3618..000000000000 --- a/sys/pc98/include/pc/bios.h +++ /dev/null @@ -1,6 +0,0 @@ -/*- - * This file is in the public domain. - */ -/* $FreeBSD$ */ - -#include <i386/pc/bios.h> diff --git a/sys/pc98/include/pc/display.h b/sys/pc98/include/pc/display.h deleted file mode 100644 index 0a906c885d8c..000000000000 --- a/sys/pc98/include/pc/display.h +++ /dev/null @@ -1,39 +0,0 @@ -/*- - * Copyright (C) 2005 TAKAHASHI Yoshihiro. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * $FreeBSD$ - */ - -#ifndef _PC98_INCLUDE_PC_DISPLAY_H_ -#define _PC98_INCLUDE_PC_DISPLAY_H_ - -#include <i386/pc/display.h> - -/* - * PC-98 attributes for foreground text. - */ -#undef FG_UNDERLINE -#define FG_UNDERLINE 0x08 - -#endif /* !_PC98_INCLUDE_PC_DISPLAY_H_ */ diff --git a/sys/pc98/include/pcaudioio.h b/sys/pc98/include/pcaudioio.h deleted file mode 100644 index 1e9eee52265f..000000000000 --- a/sys/pc98/include/pcaudioio.h +++ /dev/null @@ -1,6 +0,0 @@ -/*- - * This file is in the public domain. - */ -/* $FreeBSD$ */ - -#include <i386/pcaudioio.h> diff --git a/sys/pc98/include/pcb.h b/sys/pc98/include/pcb.h deleted file mode 100644 index 20b7d1843664..000000000000 --- a/sys/pc98/include/pcb.h +++ /dev/null @@ -1,6 +0,0 @@ -/*- - * This file is in the public domain. - */ -/* $FreeBSD$ */ - -#include <i386/pcb.h> diff --git a/sys/pc98/include/pcb_ext.h b/sys/pc98/include/pcb_ext.h deleted file mode 100644 index 81f25f63ebfd..000000000000 --- a/sys/pc98/include/pcb_ext.h +++ /dev/null @@ -1,6 +0,0 @@ -/*- - * This file is in the public domain. - */ -/* $FreeBSD$ */ - -#include <i386/pcb_ext.h> diff --git a/sys/pc98/include/pci_cfgreg.h b/sys/pc98/include/pci_cfgreg.h deleted file mode 100644 index dc9207deb23a..000000000000 --- a/sys/pc98/include/pci_cfgreg.h +++ /dev/null @@ -1,39 +0,0 @@ -/*- - * Copyright (C) 2005 M. Warner Losh. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * $FreeBSD$ - */ - -#ifndef _PC98_INCLUDE_PCI_CFGREG_H_ -#define _PC98_INCLUDE_PCI_CFGREG_H_ - -#include <i386/pci_cfgreg.h> - -/* - * PC98 uses a non-standard CONF2_FORWARD port, so redefine it here. - */ -#undef CONF2_FORWARD_PORT -#define CONF2_FORWARD_PORT 0x0cf9 - -#endif /* !_PC98_INCLUDE_PCI_CFGREG_H_ */ diff --git a/sys/pc98/include/pcpu.h b/sys/pc98/include/pcpu.h deleted file mode 100644 index 9edf432c2d49..000000000000 --- a/sys/pc98/include/pcpu.h +++ /dev/null @@ -1,6 +0,0 @@ -/*- - * This file is in the public domain. - */ -/* $FreeBSD$ */ - -#include <i386/pcpu.h> diff --git a/sys/pc98/include/perfmon.h b/sys/pc98/include/perfmon.h deleted file mode 100644 index c4e13f5189a4..000000000000 --- a/sys/pc98/include/perfmon.h +++ /dev/null @@ -1,6 +0,0 @@ -/*- - * This file is in the public domain. - */ -/* $FreeBSD$ */ - -#include <i386/perfmon.h> diff --git a/sys/pc98/include/pmap.h b/sys/pc98/include/pmap.h deleted file mode 100644 index f17c14e4c476..000000000000 --- a/sys/pc98/include/pmap.h +++ /dev/null @@ -1,6 +0,0 @@ -/*- - * This file is in the public domain. - */ -/* $FreeBSD$ */ - -#include <i386/pmap.h> diff --git a/sys/pc98/include/pmc_mdep.h b/sys/pc98/include/pmc_mdep.h deleted file mode 100644 index 5ad152e6ee98..000000000000 --- a/sys/pc98/include/pmc_mdep.h +++ /dev/null @@ -1,6 +0,0 @@ -/*- - * This file is in the public domain. - */ -/* $FreeBSD$ */ - -#include <i386/pmc_mdep.h> diff --git a/sys/pc98/include/ppireg.h b/sys/pc98/include/ppireg.h deleted file mode 100644 index e2f914655741..000000000000 --- a/sys/pc98/include/ppireg.h +++ /dev/null @@ -1,48 +0,0 @@ -/*- - * Copyright (C) 2005 TAKAHASHI Yoshihiro. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * $FreeBSD$ - */ - -#ifndef _MACHINE_PPIREG_H_ -#define _MACHINE_PPIREG_H_ - -#ifdef _KERNEL - -#define IO_PPI 0x35 /* Programmable Peripheral Interface */ - -/* - * PPI speaker control values - */ - -#define PIT_ENABLETMR1 0x08 /* Enable timer/counter 1 */ - -#define PIT_SPKR (PIT_ENABLETMR1) - -#define ppi_spkr_on() outb(IO_PPI, inb(IO_PPI) & ~PIT_SPKR) -#define ppi_spkr_off() outb(IO_PPI, inb(IO_PPI) | PIT_SPKR) - -#endif /* _KERNEL */ - -#endif /* _MACHINE_PPIREG_H_ */ diff --git a/sys/pc98/include/proc.h b/sys/pc98/include/proc.h deleted file mode 100644 index 77c2355a7500..000000000000 --- a/sys/pc98/include/proc.h +++ /dev/null @@ -1,6 +0,0 @@ -/*- - * This file is in the public domain. - */ -/* $FreeBSD$ */ - -#include <i386/proc.h> diff --git a/sys/pc98/include/profile.h b/sys/pc98/include/profile.h deleted file mode 100644 index 791bffbf73f5..000000000000 --- a/sys/pc98/include/profile.h +++ /dev/null @@ -1,6 +0,0 @@ -/*- - * This file is in the public domain. - */ -/* $FreeBSD$ */ - -#include <i386/profile.h> diff --git a/sys/pc98/include/psl.h b/sys/pc98/include/psl.h deleted file mode 100644 index 4d945a1ebbaf..000000000000 --- a/sys/pc98/include/psl.h +++ /dev/null @@ -1,6 +0,0 @@ -/*- - * This file is in the public domain. - */ -/* $FreeBSD$ */ - -#include <x86/psl.h> diff --git a/sys/pc98/include/ptrace.h b/sys/pc98/include/ptrace.h deleted file mode 100644 index bf86754d8f45..000000000000 --- a/sys/pc98/include/ptrace.h +++ /dev/null @@ -1,6 +0,0 @@ -/*- - * This file is in the public domain. - */ -/* $FreeBSD$ */ - -#include <x86/ptrace.h> diff --git a/sys/pc98/include/reg.h b/sys/pc98/include/reg.h deleted file mode 100644 index f6fb2bc6578f..000000000000 --- a/sys/pc98/include/reg.h +++ /dev/null @@ -1,6 +0,0 @@ -/*- - * This file is in the public domain. - */ -/* $FreeBSD$ */ - -#include <x86/reg.h> diff --git a/sys/pc98/include/reloc.h b/sys/pc98/include/reloc.h deleted file mode 100644 index 3666ec106817..000000000000 --- a/sys/pc98/include/reloc.h +++ /dev/null @@ -1,6 +0,0 @@ -/*- - * This file is in the public domain. - */ -/* $FreeBSD$ */ - -#include <i386/reloc.h> diff --git a/sys/pc98/include/resource.h b/sys/pc98/include/resource.h deleted file mode 100644 index 43349bfa2a8f..000000000000 --- a/sys/pc98/include/resource.h +++ /dev/null @@ -1,6 +0,0 @@ -/*- - * This file is in the public domain. - */ -/* $FreeBSD$ */ - -#include <i386/resource.h> diff --git a/sys/pc98/include/runq.h b/sys/pc98/include/runq.h deleted file mode 100644 index f6b60cf932cd..000000000000 --- a/sys/pc98/include/runq.h +++ /dev/null @@ -1,6 +0,0 @@ -/*- - * This file is in the public domain. - */ -/* $FreeBSD$ */ - -#include <i386/runq.h> diff --git a/sys/pc98/include/segments.h b/sys/pc98/include/segments.h deleted file mode 100644 index 062c3df6d18d..000000000000 --- a/sys/pc98/include/segments.h +++ /dev/null @@ -1,6 +0,0 @@ -/*- - * This file is in the public domain. - */ -/* $FreeBSD$ */ - -#include <i386/segments.h> diff --git a/sys/pc98/include/setjmp.h b/sys/pc98/include/setjmp.h deleted file mode 100644 index c4101a77fd64..000000000000 --- a/sys/pc98/include/setjmp.h +++ /dev/null @@ -1,6 +0,0 @@ -/*- - * This file is in the public domain. - */ -/* $FreeBSD$ */ - -#include <x86/setjmp.h> diff --git a/sys/pc98/include/sf_buf.h b/sys/pc98/include/sf_buf.h deleted file mode 100644 index ee9d94623c83..000000000000 --- a/sys/pc98/include/sf_buf.h +++ /dev/null @@ -1,6 +0,0 @@ -/*- - * This file is in the public domain. - */ -/* $FreeBSD$ */ - -#include <i386/sf_buf.h> diff --git a/sys/pc98/include/sigframe.h b/sys/pc98/include/sigframe.h deleted file mode 100644 index 6d7a9c5c9c96..000000000000 --- a/sys/pc98/include/sigframe.h +++ /dev/null @@ -1,6 +0,0 @@ -/*- - * This file is in the public domain. - */ -/* $FreeBSD$ */ - -#include <i386/sigframe.h> diff --git a/sys/pc98/include/signal.h b/sys/pc98/include/signal.h deleted file mode 100644 index 0c5f6dd9a62c..000000000000 --- a/sys/pc98/include/signal.h +++ /dev/null @@ -1,6 +0,0 @@ -/*- - * This file is in the public domain. - */ -/* $FreeBSD$ */ - -#include <i386/signal.h> diff --git a/sys/pc98/include/smapi.h b/sys/pc98/include/smapi.h deleted file mode 100644 index 0d83e8467aa5..000000000000 --- a/sys/pc98/include/smapi.h +++ /dev/null @@ -1,6 +0,0 @@ -/*- - * This file is in the public domain. - */ -/* $FreeBSD$ */ - -#include <i386/smapi.h> diff --git a/sys/pc98/include/smp.h b/sys/pc98/include/smp.h deleted file mode 100644 index 28d98e8d44a4..000000000000 --- a/sys/pc98/include/smp.h +++ /dev/null @@ -1,6 +0,0 @@ -/*- - * This file is in the public domain. - */ -/* $FreeBSD$ */ - -#include <i386/smp.h> diff --git a/sys/pc98/include/speaker.h b/sys/pc98/include/speaker.h deleted file mode 100644 index 31eb9b6e98c3..000000000000 --- a/sys/pc98/include/speaker.h +++ /dev/null @@ -1,6 +0,0 @@ -/*- - * This file is in the public domain. - */ -/* $FreeBSD$ */ - -#include <i386/speaker.h> diff --git a/sys/pc98/include/specialreg.h b/sys/pc98/include/specialreg.h deleted file mode 100644 index aace4bfd62e9..000000000000 --- a/sys/pc98/include/specialreg.h +++ /dev/null @@ -1,6 +0,0 @@ -/*- - * This file is in the public domain. - */ -/* $FreeBSD$ */ - -#include <x86/specialreg.h> diff --git a/sys/pc98/include/stack.h b/sys/pc98/include/stack.h deleted file mode 100644 index 2f854615f31c..000000000000 --- a/sys/pc98/include/stack.h +++ /dev/null @@ -1,6 +0,0 @@ -/*- - * This file is in the public domain. - */ -/* $FreeBSD$ */ - -#include <i386/stack.h> diff --git a/sys/pc98/include/stdarg.h b/sys/pc98/include/stdarg.h deleted file mode 100644 index 1f80090356a9..000000000000 --- a/sys/pc98/include/stdarg.h +++ /dev/null @@ -1,6 +0,0 @@ -/*- - * This file is in the public domain. - */ -/* $FreeBSD$ */ - -#include <x86/stdarg.h> diff --git a/sys/pc98/include/sysarch.h b/sys/pc98/include/sysarch.h deleted file mode 100644 index cd380d43b074..000000000000 --- a/sys/pc98/include/sysarch.h +++ /dev/null @@ -1,6 +0,0 @@ -/*- - * This file is in the public domain. - */ -/* $FreeBSD$ */ - -#include <x86/sysarch.h> diff --git a/sys/pc98/include/timerreg.h b/sys/pc98/include/timerreg.h deleted file mode 100644 index f232581a84ca..000000000000 --- a/sys/pc98/include/timerreg.h +++ /dev/null @@ -1,54 +0,0 @@ -/*- - * Copyright (C) 2005 TAKAHASHI Yoshihiro. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * $FreeBSD$ - */ - -/* - * The outputs of the three timers are connected as follows: - * - * timer 0 -> irq 0 - * timer 1 -> speaker (via keyboard controller) - * timer 2 -> RS-232C - * - * Timer 0 is used to call hardclock. - * Timer 1 is used to generate console beeps. - */ - -#ifndef _MACHINE_TIMERREG_H_ -#define _MACHINE_TIMERREG_H_ - -#ifdef _KERNEL - -#include <dev/ic/i8253reg.h> - -#define IO_TIMER1 0x71 /* 8253C Timer */ -#define TIMER_CNTR0 (IO_TIMER1 + TIMER_REG_CNTR0 * 2) -#define TIMER_CNTR1 0x3fdb -#define TIMER_CNTR2 (IO_TIMER1 + TIMER_REG_CNTR2 * 2) -#define TIMER_MODE (IO_TIMER1 + TIMER_REG_MODE * 2) - -#endif /* _KERNEL */ - -#endif /* _MACHINE_TIMERREG_H_ */ diff --git a/sys/pc98/include/trap.h b/sys/pc98/include/trap.h deleted file mode 100644 index 4d950771dcc1..000000000000 --- a/sys/pc98/include/trap.h +++ /dev/null @@ -1,6 +0,0 @@ -/*- - * This file is in the public domain. - */ -/* $FreeBSD$ */ - -#include <x86/trap.h> diff --git a/sys/pc98/include/tss.h b/sys/pc98/include/tss.h deleted file mode 100644 index e97ed51e8de2..000000000000 --- a/sys/pc98/include/tss.h +++ /dev/null @@ -1,6 +0,0 @@ -/*- - * This file is in the public domain. - */ -/* $FreeBSD$ */ - -#include <i386/tss.h> diff --git a/sys/pc98/include/ucontext.h b/sys/pc98/include/ucontext.h deleted file mode 100644 index 83422140243c..000000000000 --- a/sys/pc98/include/ucontext.h +++ /dev/null @@ -1,6 +0,0 @@ -/*- - * This file is in the public domain. - */ -/* $FreeBSD$ */ - -#include <i386/ucontext.h> diff --git a/sys/pc98/include/varargs.h b/sys/pc98/include/varargs.h deleted file mode 100644 index 21f5ce3c1c98..000000000000 --- a/sys/pc98/include/varargs.h +++ /dev/null @@ -1,6 +0,0 @@ -/*- - * This file is in the public domain. - */ -/* $FreeBSD$ */ - -#include <i386/varargs.h> diff --git a/sys/pc98/include/vdso.h b/sys/pc98/include/vdso.h deleted file mode 100644 index b81c455a92a5..000000000000 --- a/sys/pc98/include/vdso.h +++ /dev/null @@ -1,6 +0,0 @@ -/*- - * This file is in the public domain. - */ -/* $FreeBSD$ */ - -#include <x86/vdso.h> diff --git a/sys/pc98/include/vm.h b/sys/pc98/include/vm.h deleted file mode 100644 index 42451238104e..000000000000 --- a/sys/pc98/include/vm.h +++ /dev/null @@ -1,6 +0,0 @@ -/*- - * This file is in the public domain. - */ -/* $FreeBSD$ */ - -#include <i386/vm.h> diff --git a/sys/pc98/include/vm86.h b/sys/pc98/include/vm86.h deleted file mode 100644 index 5dfa21858fc0..000000000000 --- a/sys/pc98/include/vm86.h +++ /dev/null @@ -1,6 +0,0 @@ -/*- - * This file is in the public domain. - */ -/* $FreeBSD$ */ - -#include <i386/vm86.h> diff --git a/sys/pc98/include/vmparam.h b/sys/pc98/include/vmparam.h deleted file mode 100644 index 2004749c42c4..000000000000 --- a/sys/pc98/include/vmparam.h +++ /dev/null @@ -1,6 +0,0 @@ -/*- - * This file is in the public domain. - */ -/* $FreeBSD$ */ - -#include <i386/vmparam.h> diff --git a/sys/pc98/linux/linux.h b/sys/pc98/linux/linux.h deleted file mode 100644 index d330a96f7c95..000000000000 --- a/sys/pc98/linux/linux.h +++ /dev/null @@ -1,6 +0,0 @@ -/*- - * This file is in the public domain. - */ -/* $FreeBSD$ */ - -#include <i386/linux/linux.h> diff --git a/sys/pc98/linux/linux_ipc64.h b/sys/pc98/linux/linux_ipc64.h deleted file mode 100644 index 4fcdb641693f..000000000000 --- a/sys/pc98/linux/linux_ipc64.h +++ /dev/null @@ -1,6 +0,0 @@ -/*- - * This file is in the public domain. - */ -/* $FreeBSD$ */ - -#include <i386/linux/linux_ipc64.h> diff --git a/sys/pc98/linux/linux_proto.h b/sys/pc98/linux/linux_proto.h deleted file mode 100644 index f5ccdd18f567..000000000000 --- a/sys/pc98/linux/linux_proto.h +++ /dev/null @@ -1,6 +0,0 @@ -/*- - * This file is in the public domain. - */ -/* $FreeBSD$ */ - -#include <i386/linux/linux_proto.h> diff --git a/sys/pc98/pc98/busio.s b/sys/pc98/pc98/busio.s deleted file mode 100644 index 915dcae21bf0..000000000000 --- a/sys/pc98/pc98/busio.s +++ /dev/null @@ -1,1774 +0,0 @@ -/* $FreeBSD$ */ -/* $NecBSD: busio.s,v 1.16.4.1 1999/08/16 09:06:08 kmatsuda Exp $ */ -/* $NetBSD$ */ - -/*- - * [NetBSD for NEC PC-98 series] - * Copyright (c) 1996, 1997, 1998 - * NetBSD/pc98 porting staff. All rights reserved. - * - * [Ported for FreeBSD] - * Copyright (c) 2001 - * TAKAHASHI Yoshihiro. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -/* - * Copyright (c) 1997, 1998 - * Naofumi HONDA. All rights reserved. - */ - -#include <machine/asmacros.h> - -#include "assym.s" - -/*********************************************************** - * Bus IO access methods (Direct Access) - ***********************************************************/ -#define BUS_ACCESS_ADDR(BSHREG,ADDRREG) \ - addl BUS_SPACE_HANDLE_BASE/**/(%/**/BSHREG/**/),%/**/ADDRREG - -/* - * read_N - * IN: edx port - * OUT: eax data - */ -ENTRY(SBUS_DA_io_space_read_1) - BUS_ACCESS_ADDR(ebx,edx) - inb %dx,%al - ret - -ENTRY(SBUS_DA_io_space_read_2) - BUS_ACCESS_ADDR(ebx,edx) - inw %dx,%ax - ret - -ENTRY(SBUS_DA_io_space_read_4) - BUS_ACCESS_ADDR(ebx,edx) - inl %dx,%eax - ret - -/* - * write_N - * IN:eax DATA - * edx PORT - */ -ENTRY(SBUS_DA_io_space_write_1) - BUS_ACCESS_ADDR(ebx,edx) - outb %al,%dx - ret - -ENTRY(SBUS_DA_io_space_write_2) - BUS_ACCESS_ADDR(ebx,edx) - outw %ax,%dx - ret - -ENTRY(SBUS_DA_io_space_write_4) - BUS_ACCESS_ADDR(ebx,edx) - outl %eax,%dx - ret - -/* - * read_multi_N - * IN: ecx COUNT - * edx PORT - * edi BUFP - */ -ENTRY(SBUS_DA_io_space_read_multi_1) - BUS_ACCESS_ADDR(ebx,edx) - cld - rep - insb - ret - -ENTRY(SBUS_DA_io_space_read_multi_2) - BUS_ACCESS_ADDR(ebx,edx) - cld - rep - insw - ret - -ENTRY(SBUS_DA_io_space_read_multi_4) - BUS_ACCESS_ADDR(ebx,edx) - cld - rep - insl - ret - -/* - * write_multi_N - * IN: ecx COUNT - * edx PORT - * esi BUFP - */ -ENTRY(SBUS_DA_io_space_write_multi_1) - BUS_ACCESS_ADDR(ebx,edx) - cld - rep - outsb - ret - -ENTRY(SBUS_DA_io_space_write_multi_2) - BUS_ACCESS_ADDR(ebx,edx) - cld - rep - outsw - ret - -ENTRY(SBUS_DA_io_space_write_multi_4) - BUS_ACCESS_ADDR(ebx,edx) - cld - rep - outsl - ret - -/* - * read_region_N - * IN: ecx COUNT - * edx PORT - * edi BUFP - */ -ENTRY(SBUS_DA_io_space_read_region_1) - BUS_ACCESS_ADDR(ebx,edx) - cld - pushl %eax - orl %ecx,%ecx - jz 2f -1: - inb %dx,%al - stosb - incl %edx - decl %ecx - jnz 1b -2: - popl %eax - ret - -ENTRY(SBUS_DA_io_space_read_region_2) - BUS_ACCESS_ADDR(ebx,edx) - cld - pushl %eax - orl %ecx,%ecx - jz 2f -1: - inw %dx,%ax - stosw - addl $2,%edx - decl %ecx - jnz 1b -2: - popl %eax - ret - -ENTRY(SBUS_DA_io_space_read_region_4) - BUS_ACCESS_ADDR(ebx,edx) - cld - pushl %eax - orl %ecx,%ecx - jz 2f -1: - inl %dx,%eax - stosl - addl $4,%edx - decl %ecx - jnz 1b -2: - popl %eax - ret - -/* - * write_region_N - * IN: ecx COUNT - * edx PORT - * esi BUFP - */ -ENTRY(SBUS_DA_io_space_write_region_1) - BUS_ACCESS_ADDR(ebx,edx) - cld - pushl %eax - orl %ecx,%ecx - jz 2f -1: - lodsb - outb %al,%dx - incl %edx - decl %ecx - jnz 1b -2: - popl %eax - ret - -ENTRY(SBUS_DA_io_space_write_region_2) - BUS_ACCESS_ADDR(ebx,edx) - cld - pushl %eax - orl %ecx,%ecx - jz 2f -1: - lodsw - outw %ax,%dx - addl $2,%edx - decl %ecx - jnz 1b -2: - popl %eax - ret - -ENTRY(SBUS_DA_io_space_write_region_4) - BUS_ACCESS_ADDR(ebx,edx) - cld - pushl %eax - orl %ecx,%ecx - jz 2f -1: - lodsl - outl %eax,%dx - addl $4,%edx - decl %ecx - jnz 1b -2: - popl %eax - ret - -/* - * set_multi_N - * IN: eax DATA - * ecx COUNT - * edx PORT - */ -ENTRY(SBUS_DA_io_space_set_multi_1) - BUS_ACCESS_ADDR(ebx,edx) - orl %ecx,%ecx - jz 2f -1: - outb %al,%dx - decl %ecx - jnz 1b -2: - ret - -ENTRY(SBUS_DA_io_space_set_multi_2) - BUS_ACCESS_ADDR(ebx,edx) - orl %ecx,%ecx - jz 2f -1: - outw %ax,%dx - decl %ecx - jnz 1b -2: - ret - -ENTRY(SBUS_DA_io_space_set_multi_4) - BUS_ACCESS_ADDR(ebx,edx) - orl %ecx,%ecx - jz 2f -1: - outl %eax,%dx - decl %ecx - jnz 1b -2: - ret - -/* - * set_region_N - * IN: eax DATA - * ecx COUNT - * edx PORT - */ -ENTRY(SBUS_DA_io_space_set_region_1) - BUS_ACCESS_ADDR(ebx,edx) - orl %ecx,%ecx - jz 2f -1: - outb %al,%dx - incl %edx - decl %ecx - jnz 1b -2: - ret - -ENTRY(SBUS_DA_io_space_set_region_2) - BUS_ACCESS_ADDR(ebx,edx) - orl %ecx,%ecx - jz 2f -1: - outw %ax,%dx - addl $2,%edx - decl %ecx - jnz 1b -2: - ret - -ENTRY(SBUS_DA_io_space_set_region_4) - BUS_ACCESS_ADDR(ebx,edx) - orl %ecx,%ecx - jz 2f -1: - outl %eax,%dx - addl $4,%edx - decl %ecx - jnz 1b -2: - ret - -/* - * copy_region_N - * IN: ecx COUNT - * esi SPORT - * edi DPORT - */ -ENTRY(SBUS_DA_io_space_copy_region_1) - BUS_ACCESS_ADDR(eax,esi) - BUS_ACCESS_ADDR(ebx,edi) - pushl %eax - pushl %edx - orl %ecx,%ecx - jz 2f -1: - movl %esi,%edx - inb %dx,%al - incl %esi - - movl %edi,%edx - outb %al,%dx - incl %edi - - decl %ecx - jnz 1b -2: - popl %edx - popl %eax - ret - -ENTRY(SBUS_DA_io_space_copy_region_2) - BUS_ACCESS_ADDR(eax,esi) - BUS_ACCESS_ADDR(ebx,edi) - pushl %eax - pushl %edx - orl %ecx,%ecx - jz 2f -1: - movl %esi,%edx - inw %dx,%ax - addl $2,%esi - - movl %edi,%edx - outw %ax,%dx - addl $2,%edi - - decl %ecx - jnz 1b -2: - popl %edx - popl %eax - ret - -ENTRY(SBUS_DA_io_space_copy_region_4) - BUS_ACCESS_ADDR(eax,esi) - BUS_ACCESS_ADDR(ebx,edi) - pushl %eax - pushl %edx - orl %ecx,%ecx - jz 2f -1: - movl %esi,%edx - inl %dx,%eax - addl $4,%esi - - movl %edi,%edx - outl %eax,%dx - addl $4,%edi - - decl %ecx - jnz 1b -2: - popl %edx - popl %eax - ret - -/*********************************************************** - * Bus Memory access methods (Direct Access) - ***********************************************************/ -/* - * read_N - */ -ENTRY(SBUS_DA_mem_space_read_1) - BUS_ACCESS_ADDR(ebx,edx) - movb (%edx),%al - ret - -ENTRY(SBUS_DA_mem_space_read_2) - BUS_ACCESS_ADDR(ebx,edx) - movw (%edx),%ax - ret - -ENTRY(SBUS_DA_mem_space_read_4) - BUS_ACCESS_ADDR(ebx,edx) - movl (%edx),%eax - ret - -/* - * write_N - */ -ENTRY(SBUS_DA_mem_space_write_1) - BUS_ACCESS_ADDR(ebx,edx) - movb %al,(%edx) - ret - -ENTRY(SBUS_DA_mem_space_write_2) - BUS_ACCESS_ADDR(ebx,edx) - movw %ax,(%edx) - ret - -ENTRY(SBUS_DA_mem_space_write_4) - BUS_ACCESS_ADDR(ebx,edx) - movl %eax,(%edx) - ret - -/* - * read_multi_N - */ -ENTRY(SBUS_DA_mem_space_read_multi_1) - BUS_ACCESS_ADDR(ebx,edx) - cld - pushl %eax - orl %ecx,%ecx - jz 2f -1: - movb (%edx),%al - stosb - decl %ecx - jnz 1b -2: - popl %eax - ret - -ENTRY(SBUS_DA_mem_space_read_multi_2) - BUS_ACCESS_ADDR(ebx,edx) - cld - pushl %eax - orl %ecx,%ecx - jz 2f -1: - movw (%edx),%ax - stosw - decl %ecx - jnz 1b -2: - popl %eax - ret - -ENTRY(SBUS_DA_mem_space_read_multi_4) - BUS_ACCESS_ADDR(ebx,edx) - cld - pushl %eax - orl %ecx,%ecx - jz 2f -1: - movl (%edx),%eax - stosl - decl %ecx - jnz 1b -2: - popl %eax - ret - -/* - * write_multi_N - */ -ENTRY(SBUS_DA_mem_space_write_multi_1) - BUS_ACCESS_ADDR(ebx,edx) - cld - pushl %eax - orl %ecx,%ecx - jz 2f -1: - lodsb - movb %al,(%edx) - decl %ecx - jnz 1b -2: - popl %eax - ret - -ENTRY(SBUS_DA_mem_space_write_multi_2) - BUS_ACCESS_ADDR(ebx,edx) - cld - pushl %eax - orl %ecx,%ecx - jz 2f -1: - lodsw - movw %ax,(%edx) - decl %ecx - jnz 1b -2: - popl %eax - ret - -ENTRY(SBUS_DA_mem_space_write_multi_4) - BUS_ACCESS_ADDR(ebx,edx) - cld - pushl %eax - orl %ecx,%ecx - jz 2f -1: - lodsl - movl %eax,(%edx) - decl %ecx - jnz 1b -2: - popl %eax - ret - -/* - * read_region_N - */ -ENTRY(SBUS_DA_mem_space_read_region_1) - BUS_ACCESS_ADDR(ebx,edx) - cld - pushl %esi - movl %edx,%esi - rep - movsb - popl %esi - ret - -ENTRY(SBUS_DA_mem_space_read_region_2) - BUS_ACCESS_ADDR(ebx,edx) - cld - pushl %esi - movl %edx,%esi - rep - movsw - popl %esi - ret - -ENTRY(SBUS_DA_mem_space_read_region_4) - BUS_ACCESS_ADDR(ebx,edx) - cld - pushl %esi - movl %edx,%esi - rep - movsl - popl %esi - ret - -/* - * write_region_N - */ -ENTRY(SBUS_DA_mem_space_write_region_1) - BUS_ACCESS_ADDR(ebx,edx) - cld - pushl %edi - movl %edx,%edi - rep - movsb - popl %edi - ret - -ENTRY(SBUS_DA_mem_space_write_region_2) - BUS_ACCESS_ADDR(ebx,edx) - cld - pushl %edi - movl %edx,%edi - rep - movsw - popl %edi - ret - -ENTRY(SBUS_DA_mem_space_write_region_4) - BUS_ACCESS_ADDR(ebx,edx) - cld - pushl %edi - movl %edx,%edi - rep - movsl - popl %edi - ret - -/* - * set_multi_N - */ -ENTRY(SBUS_DA_mem_space_set_multi_1) - BUS_ACCESS_ADDR(ebx,edx) - orl %ecx,%ecx - jz 2f -1: - movb %al,(%edx) - decl %ecx - jnz 1b -2: - ret - -ENTRY(SBUS_DA_mem_space_set_multi_2) - BUS_ACCESS_ADDR(ebx,edx) - orl %ecx,%ecx - jz 2f -1: - movw %ax,(%edx) - decl %ecx - jnz 1b -2: - ret - -ENTRY(SBUS_DA_mem_space_set_multi_4) - BUS_ACCESS_ADDR(ebx,edx) - orl %ecx,%ecx - jz 2f -1: - movl %eax,(%edx) - decl %ecx - jnz 1b -2: - ret - -/* - * set_region_N - */ -ENTRY(SBUS_DA_mem_space_set_region_1) - BUS_ACCESS_ADDR(ebx,edx) - cld - pushl %edi - movl %edx,%edi - rep - stosb - popl %edi - ret - -ENTRY(SBUS_DA_mem_space_set_region_2) - BUS_ACCESS_ADDR(ebx,edx) - cld - pushl %edi - movl %edx,%edi - rep - stosw - popl %edi - ret - -ENTRY(SBUS_DA_mem_space_set_region_4) - BUS_ACCESS_ADDR(ebx,edx) - cld - pushl %edi - movl %edx,%edi - rep - stosl - popl %edi - ret - -/* - * copy_region_N - */ -ENTRY(SBUS_DA_mem_space_copy_region_1) - BUS_ACCESS_ADDR(eax,esi) - BUS_ACCESS_ADDR(ebx,edi) - cld - rep - movsb - ret - -ENTRY(SBUS_DA_mem_space_copy_region_2) - BUS_ACCESS_ADDR(eax,esi) - BUS_ACCESS_ADDR(ebx,edi) - cld - rep - movsw - ret - -ENTRY(SBUS_DA_mem_space_copy_region_4) - BUS_ACCESS_ADDR(eax,esi) - BUS_ACCESS_ADDR(ebx,edi) - cld - rep - movsl - ret - -#undef BUS_ACCESS_ADDR - -/*********************************************************** - * Bus IO access methods (Relocate Access) - ***********************************************************/ -#define BUS_ACCESS_ADDR(BSHREG,ADDRREG) \ - movl BUS_SPACE_HANDLE_IAT/**/(%/**/BSHREG/**/, %/**/ADDRREG/**/, 4), \ - %/**/ADDRREG -#define BUS_ACCESS_ADDR2(BSHREG,ADDRREG,DSTREG) \ - movl BUS_SPACE_HANDLE_IAT/**/(%/**/BSHREG/**/, %/**/ADDRREG/**/, 4), \ - %/**/DSTREG -/* - * read_N - * IN: edx port - * OUT: eax data - */ -ENTRY(SBUS_RA_io_space_read_1) - BUS_ACCESS_ADDR(ebx,edx) - inb %dx,%al - ret - -ENTRY(SBUS_RA_io_space_read_2) - BUS_ACCESS_ADDR(ebx,edx) - inw %dx,%ax - ret - -ENTRY(SBUS_RA_io_space_read_4) - BUS_ACCESS_ADDR(ebx,edx) - inl %dx,%eax - ret - -/* - * write_N - * IN:eax DATA - * edx PORT - */ -ENTRY(SBUS_RA_io_space_write_1) - BUS_ACCESS_ADDR(ebx,edx) - outb %al,%dx - ret - -ENTRY(SBUS_RA_io_space_write_2) - BUS_ACCESS_ADDR(ebx,edx) - outw %ax,%dx - ret - -ENTRY(SBUS_RA_io_space_write_4) - BUS_ACCESS_ADDR(ebx,edx) - outl %eax,%dx - ret - -/* - * read_multi_N - * IN: ecx COUNT - * edx PORT - * edi BUFP - */ -ENTRY(SBUS_RA_io_space_read_multi_1) - BUS_ACCESS_ADDR(ebx,edx) - cld - rep - insb - ret - -ENTRY(SBUS_RA_io_space_read_multi_2) - BUS_ACCESS_ADDR(ebx,edx) - cld - rep - insw - ret - -ENTRY(SBUS_RA_io_space_read_multi_4) - BUS_ACCESS_ADDR(ebx,edx) - cld - rep - insl - ret - -/* - * write_multi_N - * IN: ecx COUNT - * edx PORT - * esi BUFP - */ -ENTRY(SBUS_RA_io_space_write_multi_1) - BUS_ACCESS_ADDR(ebx,edx) - cld - rep - outsb - ret - -ENTRY(SBUS_RA_io_space_write_multi_2) - BUS_ACCESS_ADDR(ebx,edx) - cld - rep - outsw - ret - -ENTRY(SBUS_RA_io_space_write_multi_4) - BUS_ACCESS_ADDR(ebx,edx) - cld - rep - outsl - ret - -/* - * read_region_N - * IN: ecx COUNT - * edx PORT - * edi BUFP - */ -ENTRY(SBUS_RA_io_space_read_region_1) - cld - pushl %eax - pushl %esi - orl %ecx,%ecx - jz 2f - movl %edx,%esi -1: - BUS_ACCESS_ADDR2(ebx,esi,edx) - inb %dx,%al - stosb - incl %esi - decl %ecx - jnz 1b -2: - popl %esi - popl %eax - ret - -ENTRY(SBUS_RA_io_space_read_region_2) - cld - pushl %eax - pushl %esi - orl %ecx,%ecx - jz 2f - movl %edx,%esi -1: - BUS_ACCESS_ADDR2(ebx,esi,edx) - inw %dx,%ax - stosw - addl $2,%esi - decl %ecx - jnz 1b -2: - popl %esi - popl %eax - ret - -ENTRY(SBUS_RA_io_space_read_region_4) - cld - pushl %eax - pushl %esi - orl %ecx,%ecx - jz 2f - movl %edx,%esi -1: - BUS_ACCESS_ADDR2(ebx,esi,edx) - inl %dx,%eax - stosl - addl $4,%esi - decl %ecx - jnz 1b -2: - popl %esi - popl %eax - ret - -/* - * write_region_N - * IN: ecx COUNT - * edx PORT - * esi BUFP - */ -ENTRY(SBUS_RA_io_space_write_region_1) - cld - pushl %eax - pushl %edi - orl %ecx,%ecx - jz 2f - movl %edx,%edi -1: - BUS_ACCESS_ADDR2(ebx,edi,edx) - lodsb - outb %al,%dx - incl %edi - decl %ecx - jnz 1b -2: - popl %edi - popl %eax - ret - -ENTRY(SBUS_RA_io_space_write_region_2) - cld - pushl %eax - pushl %edi - orl %ecx,%ecx - jz 2f - movl %edx,%edi -1: - BUS_ACCESS_ADDR2(ebx,edi,edx) - lodsw - outw %ax,%dx - addl $2,%edi - decl %ecx - jnz 1b -2: - popl %edi - popl %eax - ret - -ENTRY(SBUS_RA_io_space_write_region_4) - cld - pushl %eax - pushl %edi - orl %ecx,%ecx - jz 2f - movl %edx,%edi -1: - BUS_ACCESS_ADDR2(ebx,edi,edx) - lodsl - outl %eax,%dx - addl $4,%edi - decl %ecx - jnz 1b -2: - popl %edi - popl %eax - ret - -/* - * set_multi_N - * IN: eax DATA - * ecx COUNT - * edx PORT - */ -ENTRY(SBUS_RA_io_space_set_multi_1) - BUS_ACCESS_ADDR(ebx,edx) - orl %ecx,%ecx - jz 2f -1: - outb %al,%dx - decl %ecx - jnz 1b -2: - ret - -ENTRY(SBUS_RA_io_space_set_multi_2) - BUS_ACCESS_ADDR(ebx,edx) - orl %ecx,%ecx - jz 2f -1: - outw %ax,%dx - decl %ecx - jnz 1b -2: - ret - -ENTRY(SBUS_RA_io_space_set_multi_4) - BUS_ACCESS_ADDR(ebx,edx) - orl %ecx,%ecx - jz 2f -1: - outl %eax,%dx - decl %ecx - jnz 1b -2: - ret - -/* - * set_region_N - * IN: eax DATA - * ecx COUNT - * edx PORT - */ -ENTRY(SBUS_RA_io_space_set_region_1) - pushl %edi - orl %ecx,%ecx - jz 2f - movl %edx,%edi -1: - BUS_ACCESS_ADDR2(ebx,edi,edx) - outb %al,%dx - incl %edi - decl %ecx - jnz 1b -2: - popl %edi - ret - -ENTRY(SBUS_RA_io_space_set_region_2) - pushl %edi - orl %ecx,%ecx - jz 2f - movl %edx,%edi -1: - BUS_ACCESS_ADDR2(ebx,edi,edx) - outw %ax,%dx - addl $2,%edi - decl %ecx - jnz 1b -2: - popl %edi - ret - -ENTRY(SBUS_RA_io_space_set_region_4) - pushl %edi - orl %ecx,%ecx - jz 2f - movl %edx,%edi -1: - BUS_ACCESS_ADDR2(ebx,edi,edx) - outl %eax,%dx - addl $4,%edi - decl %ecx - jnz 1b -2: - popl %edi - ret - -/* - * copy_region_N - * IN: ecx COUNT - * esi SPORT - * edi DPORT - */ -ENTRY(SBUS_RA_io_space_copy_region_1) - pushl %eax - pushl %edx - orl %ecx,%ecx - jz 2f -1: - BUS_ACCESS_ADDR2(ebx,esi,edx) - inb %dx,%al - incl %esi - - BUS_ACCESS_ADDR2(ebx,edi,edx) - outb %al,%dx - incl %edi - - decl %ecx - jnz 1b -2: - popl %edx - popl %eax - ret - -ENTRY(SBUS_RA_io_space_copy_region_2) - pushl %eax - pushl %edx - orl %ecx,%ecx - jz 2f -1: - BUS_ACCESS_ADDR2(ebx,esi,edx) - inw %dx,%ax - addl $2,%esi - - BUS_ACCESS_ADDR2(ebx,edi,edx) - outw %ax,%dx - addl $2,%edi - - decl %ecx - jnz 1b -2: - popl %edx - popl %eax - ret - -ENTRY(SBUS_RA_io_space_copy_region_4) - pushl %eax - pushl %edx - orl %ecx,%ecx - jz 2f -1: - BUS_ACCESS_ADDR2(ebx,esi,edx) - inl %dx,%eax - addl $4,%esi - - BUS_ACCESS_ADDR2(ebx,edi,edx) - outl %eax,%dx - addl $4,%edi - - decl %ecx - jnz 1b -2: - popl %edx - popl %eax - ret - -/*********************************************************** - * Bus Memory access methods - ***********************************************************/ -/* - * read_N - */ -ENTRY(SBUS_RA_mem_space_read_1) - BUS_ACCESS_ADDR(ebx,edx) - movb (%edx),%al - ret - -ENTRY(SBUS_RA_mem_space_read_2) - BUS_ACCESS_ADDR(ebx,edx) - movw (%edx),%ax - ret - -ENTRY(SBUS_RA_mem_space_read_4) - BUS_ACCESS_ADDR(ebx,edx) - movl (%edx),%eax - ret - -/* - * write_N - */ -ENTRY(SBUS_RA_mem_space_write_1) - BUS_ACCESS_ADDR(ebx,edx) - movb %al,(%edx) - ret - -ENTRY(SBUS_RA_mem_space_write_2) - BUS_ACCESS_ADDR(ebx,edx) - movw %ax,(%edx) - ret - -ENTRY(SBUS_RA_mem_space_write_4) - BUS_ACCESS_ADDR(ebx,edx) - movl %eax,(%edx) - ret - -/* - * read_multi_N - */ -ENTRY(SBUS_RA_mem_space_read_multi_1) - BUS_ACCESS_ADDR(ebx,edx) - cld - pushl %eax - orl %ecx,%ecx - jz 2f -1: - movb (%edx),%al - stosb - decl %ecx - jnz 1b -2: - popl %eax - ret - -ENTRY(SBUS_RA_mem_space_read_multi_2) - BUS_ACCESS_ADDR(ebx,edx) - cld - pushl %eax - orl %ecx,%ecx - jz 2f -1: - movw (%edx),%ax - stosw - decl %ecx - jnz 1b -2: - popl %eax - ret - -ENTRY(SBUS_RA_mem_space_read_multi_4) - BUS_ACCESS_ADDR(ebx,edx) - cld - pushl %eax - orl %ecx,%ecx - jz 2f -1: - movl (%edx),%eax - stosl - decl %ecx - jnz 1b -2: - popl %eax - ret - -/* - * write_multi_N - */ -ENTRY(SBUS_RA_mem_space_write_multi_1) - BUS_ACCESS_ADDR(ebx,edx) - cld - pushl %eax - orl %ecx,%ecx - jz 2f -1: - lodsb - movb %al,(%edx) - decl %ecx - jnz 1b -2: - popl %eax - ret - -ENTRY(SBUS_RA_mem_space_write_multi_2) - BUS_ACCESS_ADDR(ebx,edx) - cld - pushl %eax - orl %ecx,%ecx - jz 2f -1: - lodsw - movw %ax,(%edx) - decl %ecx - jnz 1b -2: - popl %eax - ret - -ENTRY(SBUS_RA_mem_space_write_multi_4) - BUS_ACCESS_ADDR(ebx,edx) - cld - pushl %eax - orl %ecx,%ecx - jz 2f -1: - lodsl - movl %eax,(%edx) - decl %ecx - jnz 1b -2: - popl %eax - ret - -/* - * read_region_N - */ -ENTRY(SBUS_RA_mem_space_read_region_1) - cld - pushl %esi - orl %ecx,%ecx - jz 2f -1: - BUS_ACCESS_ADDR2(ebx,edx,esi) - movsb - incl %edx - decl %ecx - jnz 1b -2: - popl %esi - ret - -ENTRY(SBUS_RA_mem_space_read_region_2) - cld - pushl %esi - orl %ecx,%ecx - jz 2f -1: - BUS_ACCESS_ADDR2(ebx,edx,esi) - movsw - addl $2,%edx - decl %ecx - jnz 1b -2: - popl %esi - ret - -ENTRY(SBUS_RA_mem_space_read_region_4) - cld - pushl %esi - orl %ecx,%ecx - jz 2f -1: - BUS_ACCESS_ADDR2(ebx,edx,esi) - movsl - addl $4,%edx - decl %ecx - jnz 1b -2: - popl %esi - ret - -/* - * write_region_N - */ -ENTRY(SBUS_RA_mem_space_write_region_1) - cld - pushl %edi - orl %ecx,%ecx - jz 2f -1: - BUS_ACCESS_ADDR2(ebx,edx,edi) - movsb - incl %edx - decl %ecx - jnz 1b -2: - popl %edi - ret - -ENTRY(SBUS_RA_mem_space_write_region_2) - cld - pushl %edi - orl %ecx,%ecx - jz 2f -1: - BUS_ACCESS_ADDR2(ebx,edx,edi) - movsw - addl $2,%edx - decl %ecx - jnz 1b -2: - popl %edi - ret - -ENTRY(SBUS_RA_mem_space_write_region_4) - cld - pushl %edi - orl %ecx,%ecx - jz 2f -1: - BUS_ACCESS_ADDR2(ebx,edx,edi) - movsl - addl $4,%edx - decl %ecx - jnz 1b -2: - popl %edi - ret - -/* - * set_multi_N - */ -ENTRY(SBUS_RA_mem_space_set_multi_1) - BUS_ACCESS_ADDR(ebx,edx) - orl %ecx,%ecx - jz 2f -1: - movb %al,(%edx) - decl %ecx - jnz 1b -2: - ret - -ENTRY(SBUS_RA_mem_space_set_multi_2) - BUS_ACCESS_ADDR(ebx,edx) - orl %ecx,%ecx - jz 2f -1: - movw %ax,(%edx) - decl %ecx - jnz 1b -2: - ret - -ENTRY(SBUS_RA_mem_space_set_multi_4) - BUS_ACCESS_ADDR(ebx,edx) - orl %ecx,%ecx - jz 2f -1: - movl %eax,(%edx) - decl %ecx - jnz 1b -2: - ret - -/* - * set_region_N - */ -ENTRY(SBUS_RA_mem_space_set_region_1) - cld - pushl %edi - orl %ecx,%ecx - jz 2f -1: - BUS_ACCESS_ADDR2(ebx,edx,edi) - stosb - incl %edx - decl %ecx - jnz 1b -2: - popl %edi - ret - -ENTRY(SBUS_RA_mem_space_set_region_2) - cld - pushl %edi - orl %ecx,%ecx - jz 2f -1: - BUS_ACCESS_ADDR2(ebx,edx,edi) - stosw - addl $2,%edx - decl %ecx - jnz 1b -2: - popl %edi - ret - -ENTRY(SBUS_RA_mem_space_set_region_4) - cld - pushl %edi - orl %ecx,%ecx - jz 2f -1: - BUS_ACCESS_ADDR2(ebx,edx,edi) - stosl - addl $4,%edx - decl %ecx - jnz 1b -2: - popl %edi - ret - -/* - * copy_region_N - */ -ENTRY(SBUS_RA_mem_space_copy_region_1) - cld - orl %ecx,%ecx - jz 2f -1: - pushl %esi - pushl %edi - BUS_ACCESS_ADDR(eax,esi) - BUS_ACCESS_ADDR(ebx,edi) - movsb - popl %edi - popl %esi - incl %esi - incl %edi - decl %ecx - jnz 1b -2: - ret - -ENTRY(SBUS_RA_mem_space_copy_region_2) - cld - orl %ecx,%ecx - jz 2f -1: - pushl %esi - pushl %edi - BUS_ACCESS_ADDR(eax,esi) - BUS_ACCESS_ADDR(ebx,edi) - movsw - popl %edi - popl %esi - addl $2,%esi - addl $2,%edi - decl %ecx - jnz 1b -2: - ret - -ENTRY(SBUS_RA_mem_space_copy_region_4) - cld - orl %ecx,%ecx - jz 2f -1: - pushl %esi - pushl %edi - BUS_ACCESS_ADDR(eax,esi) - BUS_ACCESS_ADDR(ebx,edi) - movsl - popl %edi - popl %esi - addl $4,%esi - addl $4,%edi - decl %ecx - jnz 1b -2: - ret - -#undef BUS_ACCESS_ADDR -#undef BUS_ACCESS_ADDR2 - - -#include "opt_mecia.h" -#ifdef DEV_MECIA - -/*********************************************************** - * NEPC pcmcia 16 bits bus access - ***********************************************************/ -#define NEPC_SWITCH_BUS16 \ - pushl %ebp ;\ - pushl %eax ;\ - pushl %edx ;\ - movl $0x2a8e,%edx ;\ - inb %dx,%al ;\ - movl %eax,%ebp ;\ - andl $~0x20,%eax ;\ - outb %al,%dx ;\ - popl %edx ;\ - popl %eax - -#define NEPC_BUS_RESTORE \ - pushl %eax ;\ - movl %ebp,%eax ;\ - xchgl %edx,%ebp ;\ - movl $0x2a8e,%edx ;\ - outb %al,%dx ;\ - xchgl %ebp,%edx ;\ - popl %eax ;\ - popl %ebp - -/*********************************************************** - * NEPC pcmcia 16 bits bus acces (Direct Access) - ***********************************************************/ -#define BUS_ACCESS_ADDR(BSHREG,ADDRREG) \ - addl BUS_SPACE_HANDLE_BASE/**/(%/**/BSHREG/**/),%/**/ADDRREG - -ENTRY(NEPC_DA_io_space_read_2) - BUS_ACCESS_ADDR(ebx,edx) - NEPC_SWITCH_BUS16 - inw %dx,%ax - NEPC_BUS_RESTORE - ret - - -ENTRY(NEPC_DA_io_space_write_2) - BUS_ACCESS_ADDR(ebx,edx) - NEPC_SWITCH_BUS16 - outw %ax,%dx - NEPC_BUS_RESTORE - ret - -ENTRY(NEPC_DA_io_space_read_multi_2) - BUS_ACCESS_ADDR(ebx,edx) - NEPC_SWITCH_BUS16 - cld - rep - insw - NEPC_BUS_RESTORE - ret - -ENTRY(NEPC_DA_io_space_write_multi_2) - BUS_ACCESS_ADDR(ebx,edx) - NEPC_SWITCH_BUS16 - cld - rep - outsw - NEPC_BUS_RESTORE - ret - -ENTRY(NEPC_DA_io_space_read_region_2) - NEPC_SWITCH_BUS16 - call SBUS_DA_io_space_read_region_2 - NEPC_BUS_RESTORE - ret - -ENTRY(NEPC_DA_io_space_write_region_2) - NEPC_SWITCH_BUS16 - call SBUS_DA_io_space_write_region_2 - NEPC_BUS_RESTORE - ret - -ENTRY(NEPC_DA_io_space_set_multi_2) - NEPC_SWITCH_BUS16 - call SBUS_DA_io_space_set_multi_2 - NEPC_BUS_RESTORE - ret - - -ENTRY(NEPC_DA_io_space_set_region_2) - NEPC_SWITCH_BUS16 - call SBUS_DA_io_space_set_region_2 - NEPC_BUS_RESTORE - ret - -ENTRY(NEPC_DA_io_space_copy_region_2) - NEPC_SWITCH_BUS16 - call SBUS_DA_io_space_copy_region_2 - NEPC_BUS_RESTORE - ret - -ENTRY(NEPC_DA_io_space_read_4) - BUS_ACCESS_ADDR(ebx,edx) - NEPC_SWITCH_BUS16 - inl %dx,%eax - NEPC_BUS_RESTORE - ret - -ENTRY(NEPC_DA_io_space_write_4) - BUS_ACCESS_ADDR(ebx,edx) - NEPC_SWITCH_BUS16 - outl %eax,%dx - NEPC_BUS_RESTORE - ret - -ENTRY(NEPC_DA_io_space_read_multi_4) - BUS_ACCESS_ADDR(ebx,edx) - NEPC_SWITCH_BUS16 - cld - rep - insl - NEPC_BUS_RESTORE - ret - -ENTRY(NEPC_DA_io_space_write_multi_4) - BUS_ACCESS_ADDR(ebx,edx) - NEPC_SWITCH_BUS16 - cld - rep - outsl - NEPC_BUS_RESTORE - ret - -ENTRY(NEPC_DA_io_space_read_region_4) - NEPC_SWITCH_BUS16 - call SBUS_DA_io_space_read_region_4 - NEPC_BUS_RESTORE - ret - -ENTRY(NEPC_DA_io_space_write_region_4) - NEPC_SWITCH_BUS16 - call SBUS_DA_io_space_write_region_4 - NEPC_BUS_RESTORE - ret - -ENTRY(NEPC_DA_io_space_set_multi_4) - NEPC_SWITCH_BUS16 - call SBUS_DA_io_space_set_multi_4 - NEPC_BUS_RESTORE - ret - - -ENTRY(NEPC_DA_io_space_set_region_4) - NEPC_SWITCH_BUS16 - call SBUS_DA_io_space_set_region_4 - NEPC_BUS_RESTORE - ret - -ENTRY(NEPC_DA_io_space_copy_region_4) - NEPC_SWITCH_BUS16 - call SBUS_DA_io_space_copy_region_4 - NEPC_BUS_RESTORE - ret - -#undef BUS_ACCESS_ADDR - -/*********************************************************** - * NEPC pcmcia 16 bits bus acces (Relocate Access) - ***********************************************************/ -#define BUS_ACCESS_ADDR(BSHREG,ADDRREG) \ - movl BUS_SPACE_HANDLE_IAT/**/(%/**/BSHREG/**/, %/**/ADDRREG/**/, 4), \ - %/**/ADDRREG - -ENTRY(NEPC_RA_io_space_read_2) - BUS_ACCESS_ADDR(ebx,edx) - NEPC_SWITCH_BUS16 - inw %dx,%ax - NEPC_BUS_RESTORE - ret - - -ENTRY(NEPC_RA_io_space_write_2) - BUS_ACCESS_ADDR(ebx,edx) - NEPC_SWITCH_BUS16 - outw %ax,%dx - NEPC_BUS_RESTORE - ret - -ENTRY(NEPC_RA_io_space_read_multi_2) - BUS_ACCESS_ADDR(ebx,edx) - NEPC_SWITCH_BUS16 - cld - rep - insw - NEPC_BUS_RESTORE - ret - -ENTRY(NEPC_RA_io_space_write_multi_2) - BUS_ACCESS_ADDR(ebx,edx) - NEPC_SWITCH_BUS16 - cld - rep - outsw - NEPC_BUS_RESTORE - ret - -ENTRY(NEPC_RA_io_space_read_region_2) - NEPC_SWITCH_BUS16 - call SBUS_RA_io_space_read_region_2 - NEPC_BUS_RESTORE - ret - -ENTRY(NEPC_RA_io_space_write_region_2) - NEPC_SWITCH_BUS16 - call SBUS_RA_io_space_write_region_2 - NEPC_BUS_RESTORE - ret - -ENTRY(NEPC_RA_io_space_set_multi_2) - NEPC_SWITCH_BUS16 - call SBUS_RA_io_space_set_multi_2 - NEPC_BUS_RESTORE - ret - - -ENTRY(NEPC_RA_io_space_set_region_2) - NEPC_SWITCH_BUS16 - call SBUS_RA_io_space_set_region_2 - NEPC_BUS_RESTORE - ret - -ENTRY(NEPC_RA_io_space_copy_region_2) - NEPC_SWITCH_BUS16 - call SBUS_RA_io_space_copy_region_2 - NEPC_BUS_RESTORE - ret - -ENTRY(NEPC_RA_io_space_read_4) - BUS_ACCESS_ADDR(ebx,edx) - NEPC_SWITCH_BUS16 - inl %dx,%eax - NEPC_BUS_RESTORE - ret - -ENTRY(NEPC_RA_io_space_write_4) - BUS_ACCESS_ADDR(ebx,edx) - NEPC_SWITCH_BUS16 - outl %eax,%dx - NEPC_BUS_RESTORE - ret - -ENTRY(NEPC_RA_io_space_read_multi_4) - BUS_ACCESS_ADDR(ebx,edx) - NEPC_SWITCH_BUS16 - cld - rep - insl - NEPC_BUS_RESTORE - ret - -ENTRY(NEPC_RA_io_space_write_multi_4) - BUS_ACCESS_ADDR(ebx,edx) - NEPC_SWITCH_BUS16 - cld - rep - outsl - NEPC_BUS_RESTORE - ret - -ENTRY(NEPC_RA_io_space_read_region_4) - NEPC_SWITCH_BUS16 - call SBUS_RA_io_space_read_region_4 - NEPC_BUS_RESTORE - ret - -ENTRY(NEPC_RA_io_space_write_region_4) - NEPC_SWITCH_BUS16 - call SBUS_RA_io_space_write_region_4 - NEPC_BUS_RESTORE - ret - -ENTRY(NEPC_RA_io_space_set_multi_4) - NEPC_SWITCH_BUS16 - call SBUS_RA_io_space_set_multi_4 - NEPC_BUS_RESTORE - ret - - -ENTRY(NEPC_RA_io_space_set_region_4) - NEPC_SWITCH_BUS16 - call SBUS_RA_io_space_set_region_4 - NEPC_BUS_RESTORE - ret - -ENTRY(NEPC_RA_io_space_copy_region_4) - NEPC_SWITCH_BUS16 - call SBUS_RA_io_space_copy_region_4 - NEPC_BUS_RESTORE - ret - -#endif /* DEV_MECIA */ diff --git a/sys/pc98/pc98/busiosubr.c b/sys/pc98/pc98/busiosubr.c deleted file mode 100644 index 926c1ce88e85..000000000000 --- a/sys/pc98/pc98/busiosubr.c +++ /dev/null @@ -1,331 +0,0 @@ -/* $FreeBSD$ */ -/* $NecBSD: busiosubr.c,v 1.30.4.4 1999/08/28 02:25:35 honda Exp $ */ -/* $NetBSD$ */ - -/*- - * [NetBSD for NEC PC-98 series] - * Copyright (c) 1996, 1997, 1998 - * NetBSD/pc98 porting staff. All rights reserved. - * - * [Ported for FreeBSD] - * Copyright (c) 2001 - * TAKAHASHI Yoshihiro. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -/* - * Copyright (c) 1997, 1998 - * Naofumi HONDA. All rights reserved. - */ - -#include <sys/param.h> -#include <sys/systm.h> -#include <sys/kernel.h> -#include <sys/malloc.h> -#include <machine/bus.h> - -static MALLOC_DEFINE(M_BUSSPACEHANDLE, "busspacehandle", "Bus space handle"); - -_BUS_SPACE_CALL_FUNCS_PROTO(SBUS_DA_io,u_int8_t,1) -_BUS_SPACE_CALL_FUNCS_PROTO(SBUS_DA_io,u_int16_t,2) -_BUS_SPACE_CALL_FUNCS_PROTO(SBUS_DA_io,u_int32_t,4) -_BUS_SPACE_CALL_FUNCS_PROTO(SBUS_DA_mem,u_int8_t,1) -_BUS_SPACE_CALL_FUNCS_PROTO(SBUS_DA_mem,u_int16_t,2) -_BUS_SPACE_CALL_FUNCS_PROTO(SBUS_DA_mem,u_int32_t,4) - -_BUS_SPACE_CALL_FUNCS_PROTO(SBUS_RA_io,u_int8_t,1) -_BUS_SPACE_CALL_FUNCS_PROTO(SBUS_RA_io,u_int16_t,2) -_BUS_SPACE_CALL_FUNCS_PROTO(SBUS_RA_io,u_int32_t,4) -_BUS_SPACE_CALL_FUNCS_PROTO(SBUS_RA_mem,u_int8_t,1) -_BUS_SPACE_CALL_FUNCS_PROTO(SBUS_RA_mem,u_int16_t,2) -_BUS_SPACE_CALL_FUNCS_PROTO(SBUS_RA_mem,u_int32_t,4) - -struct bus_space_tag SBUS_io_space_tag = { - BUS_SPACE_TAG_IO, - - /* direct bus access methods */ - { - _BUS_SPACE_CALL_FUNCS_TAB(SBUS_DA_io,u_int8_t,1), - _BUS_SPACE_CALL_FUNCS_TAB(SBUS_DA_io,u_int16_t,2), - _BUS_SPACE_CALL_FUNCS_TAB(SBUS_DA_io,u_int32_t,4), - }, - - /* relocate bus access methods */ - { - _BUS_SPACE_CALL_FUNCS_TAB(SBUS_RA_io,u_int8_t,1), - _BUS_SPACE_CALL_FUNCS_TAB(SBUS_RA_io,u_int16_t,2), - _BUS_SPACE_CALL_FUNCS_TAB(SBUS_RA_io,u_int32_t,4), - } -}; - -struct bus_space_tag SBUS_mem_space_tag = { - BUS_SPACE_TAG_MEM, - - /* direct bus access methods */ - { - _BUS_SPACE_CALL_FUNCS_TAB(SBUS_DA_mem,u_int8_t,1), - _BUS_SPACE_CALL_FUNCS_TAB(SBUS_DA_mem,u_int16_t,2), - _BUS_SPACE_CALL_FUNCS_TAB(SBUS_DA_mem,u_int32_t,4), - }, - - /* relocate bus access methods */ - { - _BUS_SPACE_CALL_FUNCS_TAB(SBUS_RA_mem,u_int8_t,1), - _BUS_SPACE_CALL_FUNCS_TAB(SBUS_RA_mem,u_int16_t,2), - _BUS_SPACE_CALL_FUNCS_TAB(SBUS_RA_mem,u_int32_t,4), - } -}; - - -#include "opt_mecia.h" -#ifdef DEV_MECIA - -_BUS_SPACE_CALL_FUNCS_PROTO(NEPC_DA_io,u_int16_t,2) -_BUS_SPACE_CALL_FUNCS_PROTO(NEPC_DA_io,u_int32_t,4) - -_BUS_SPACE_CALL_FUNCS_PROTO(NEPC_RA_io,u_int16_t,2) -_BUS_SPACE_CALL_FUNCS_PROTO(NEPC_RA_io,u_int32_t,4) - -struct bus_space_tag NEPC_io_space_tag = { - BUS_SPACE_TAG_IO, - - /* direct bus access methods */ - { - _BUS_SPACE_CALL_FUNCS_TAB(SBUS_DA_io,u_int8_t,1), - _BUS_SPACE_CALL_FUNCS_TAB(NEPC_DA_io,u_int16_t,2), - _BUS_SPACE_CALL_FUNCS_TAB(NEPC_DA_io,u_int32_t,4), - }, - - /* relocate bus access methods */ - { - _BUS_SPACE_CALL_FUNCS_TAB(SBUS_RA_io,u_int8_t,1), - _BUS_SPACE_CALL_FUNCS_TAB(NEPC_RA_io,u_int16_t,2), - _BUS_SPACE_CALL_FUNCS_TAB(NEPC_RA_io,u_int32_t,4), - } -}; - -struct bus_space_tag NEPC_mem_space_tag = { - BUS_SPACE_TAG_MEM, - - /* direct bus access methods */ - { - _BUS_SPACE_CALL_FUNCS_TAB(SBUS_DA_mem,u_int8_t,1), - _BUS_SPACE_CALL_FUNCS_TAB(SBUS_DA_mem,u_int16_t,2), - _BUS_SPACE_CALL_FUNCS_TAB(SBUS_DA_mem,u_int32_t,4), - }, - - /* relocate bus access methods */ - { - _BUS_SPACE_CALL_FUNCS_TAB(SBUS_RA_mem,u_int8_t,1), - _BUS_SPACE_CALL_FUNCS_TAB(SBUS_RA_mem,u_int16_t,2), - _BUS_SPACE_CALL_FUNCS_TAB(SBUS_RA_mem,u_int32_t,4), - } -}; - -#endif /* DEV_MECIA */ - -/************************************************************************* - * map init - *************************************************************************/ -static __inline void -bus_space_iat_init(bus_space_handle_t bsh) -{ - int i; - - for (i = 0; i < bsh->bsh_maxiatsz; i++) - bsh->bsh_iat[i] = bsh->bsh_base + i; -} - -/************************************************************************* - * handle allocation - *************************************************************************/ -int -i386_bus_space_handle_alloc(bus_space_tag_t t, bus_addr_t bpa, bus_size_t size, - bus_space_handle_t *bshp) -{ - bus_space_handle_t bsh; - - bsh = (bus_space_handle_t) malloc(sizeof (*bsh), M_BUSSPACEHANDLE, - M_NOWAIT | M_ZERO); - if (bsh == NULL) - return ENOMEM; - - bsh->bsh_maxiatsz = BUS_SPACE_IAT_MAXSIZE; - bsh->bsh_iatsz = 0; - bsh->bsh_base = bpa; - bsh->bsh_sz = size; - bsh->bsh_res = NULL; - bsh->bsh_ressz = 0; - bus_space_iat_init(bsh); - - bsh->bsh_bam = t->bs_da; /* default: direct access */ - - *bshp = bsh; - return 0; -} - -void -i386_bus_space_handle_free(bus_space_tag_t t, bus_space_handle_t bsh, - size_t size) -{ - - free(bsh, M_BUSSPACEHANDLE); -} - -/************************************************************************* - * map - *************************************************************************/ -int -i386_memio_map(bus_space_tag_t t, bus_addr_t bpa, bus_size_t size, int flags, - bus_space_handle_t *bshp) -{ - - return i386_bus_space_handle_alloc(t, bpa, size, bshp); -} - -void -i386_memio_unmap(bus_space_tag_t t, bus_space_handle_t bsh, bus_size_t size) -{ - - i386_bus_space_handle_free(t, bsh, bsh->bsh_sz); -} - -void -i386_memio_free(bus_space_tag_t t, bus_space_handle_t bsh, bus_size_t size) -{ - - /* i386_memio_unmap() does all that we need to do. */ - i386_memio_unmap(t, bsh, bsh->bsh_sz); -} - -int -i386_memio_map_load(bus_space_tag_t t, bus_space_handle_t bsh, - bus_size_t size, bus_space_iat_t iat, u_int flags __unused) -{ - int i; - - if (size > bsh->bsh_maxiatsz) { - printf("i386_memio_map_load: map size too large\n"); - return EINVAL; - } - - for (i = 0; i < bsh->bsh_maxiatsz; i++) { - if (i < size) - bsh->bsh_iat[i] = iat[i]; - else - bsh->bsh_iat[i] = 0; - bsh->bsh_iat[i] += bsh->bsh_base; - } - - bsh->bsh_iatsz = size; - bsh->bsh_bam = t->bs_ra; /* relocate access */ - - return 0; -} - -int -i386_memio_subregion(bus_space_tag_t t, bus_space_handle_t pbsh, - bus_size_t offset, bus_size_t size, - bus_space_handle_t *tbshp) -{ - int i, error = 0; - bus_space_handle_t bsh; - bus_addr_t pbase; - - pbase = pbsh->bsh_base + offset; - switch (t->bs_tag) { - case BUS_SPACE_TAG_IO: - if (pbsh->bsh_iatsz > 0) { - if (offset >= pbsh->bsh_iatsz || - offset + size > pbsh->bsh_iatsz) - return EINVAL; - pbase = pbsh->bsh_base; - } - break; - - case BUS_SPACE_TAG_MEM: - if (pbsh->bsh_iatsz > 0) - return EINVAL; - if (offset > pbsh->bsh_sz || offset + size > pbsh->bsh_sz) - return EINVAL; - break; - - default: - panic("i386_memio_subregion: bad bus space tag"); - break; - } - - error = i386_bus_space_handle_alloc(t, pbase, size, &bsh); - if (error != 0) - return error; - - switch (t->bs_tag) { - case BUS_SPACE_TAG_IO: - if (pbsh->bsh_iatsz > 0) { - for (i = 0; i < size; i ++) - bsh->bsh_iat[i] = pbsh->bsh_iat[i + offset]; - bsh->bsh_iatsz = size; - } else if (pbsh->bsh_base > bsh->bsh_base || - pbsh->bsh_base + pbsh->bsh_sz < - bsh->bsh_base + bsh->bsh_sz) { - i386_bus_space_handle_free(t, bsh, size); - return EINVAL; - } - break; - - case BUS_SPACE_TAG_MEM: - break; - } - - if (pbsh->bsh_iatsz > 0) - bsh->bsh_bam = t->bs_ra; /* relocate access */ - *tbshp = bsh; - return error; -} - -int -i386_memio_compare(bus_space_tag_t t1, bus_space_handle_t bsh1, - bus_space_tag_t t2, bus_space_handle_t bsh2) -{ - int i; - - if (t1->bs_tag != t2->bs_tag) - return (1); - if (bsh1->bsh_base != bsh2->bsh_base) - return (1); - if (bsh1->bsh_sz != bsh2->bsh_sz) - return (1); - if (bsh1->bsh_bam.bs_read_1 != bsh2->bsh_bam.bs_read_1) /* XXX */ - return (1); - - if (bsh1->bsh_iatsz != bsh2->bsh_iatsz) - return (1); - for (i = 0; i < bsh1->bsh_iatsz; i++) { - if (bsh1->bsh_iat[i] != bsh2->bsh_iat[i]) - return (1); - } - - return (0); -} diff --git a/sys/pc98/pc98/canbepm.c b/sys/pc98/pc98/canbepm.c deleted file mode 100644 index 5c347a07e187..000000000000 --- a/sys/pc98/pc98/canbepm.c +++ /dev/null @@ -1,137 +0,0 @@ -/*- - * Copyright (c) 2000 KIYOHARA Takashi <kiyohara@kk.iij4u.ne.jp> - * Copyright (c) 2000 Takanori Watanabe <takawata@jp.FreeBSD.org> - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * $FreeBSD$ - */ - -#include <sys/param.h> -#include <sys/systm.h> -#include <sys/bus.h> -#include <sys/eventhandler.h> -#include <sys/kernel.h> -#include <sys/module.h> -#include <sys/reboot.h> - -#include <machine/bus.h> -#include <machine/resource.h> -#include <sys/rman.h> - -#include <pc98/pc98/canbusvars.h> -#include "canbus_if.h" - - -/* canbepm softc */ -struct canbepm_softc { - device_t canbepm_dev; /* canbepm device */ - - eventhandler_tag canbepm_tag; /* event handler tag */ -}; - - -static void canbepm_soft_off (void *, int); -static void canbepm_identify (driver_t *, device_t); -static int canbepm_probe (device_t); -static int canbepm_attach (device_t); -static int canbepm_detach (device_t); - - -static device_method_t canbepm_methods[] = { - DEVMETHOD(device_identify, canbepm_identify), - DEVMETHOD(device_probe, canbepm_probe), - DEVMETHOD(device_attach, canbepm_attach), - DEVMETHOD(device_detach, canbepm_detach), - {0, 0} -}; - -static driver_t canbepm_driver = { - "canbepm", - canbepm_methods, - sizeof(struct canbepm_softc), -}; - -devclass_t canbepm_devclass; -DRIVER_MODULE(canbepm, canbus, canbepm_driver, canbepm_devclass, 0, 0); -MODULE_DEPEND(canbepm, canbus, 1, 1, 1); - - -static void -canbepm_soft_off (void *data, int howto) -{ - struct canbepm_softc *sc = data; - u_int8_t poweroff_data[] = CANBE_POWEROFF_DATA; - - if (!(howto & RB_POWEROFF)) - return; - - CANBUS_WRITE_MULTI(device_get_parent(sc->canbepm_dev), sc->canbepm_dev, - CANBE_POWER_CTRL, sizeof (poweroff_data), poweroff_data); -} - - -static void -canbepm_identify(driver_t *drv, device_t parent) -{ - if (device_find_child(parent, "canbepm", 0) == NULL) { - if (BUS_ADD_CHILD(parent, 33, "canbepm", 0) == NULL) - device_printf(parent, "canbepm cannot attach\n"); - } -} - - -static int -canbepm_probe(device_t dev) -{ - device_set_desc(dev, "CanBe Power Management Controller"); - - return (0); -} - -static int -canbepm_attach(device_t dev) -{ - struct canbepm_softc *sc = device_get_softc(dev); - - /* eventhandler regist */ - sc->canbepm_tag = EVENTHANDLER_REGISTER( - shutdown_final, canbepm_soft_off, sc, SHUTDOWN_PRI_LAST); - - sc->canbepm_dev = dev; - - return (0); -} - - -static int -canbepm_detach(device_t dev) -{ - struct canbepm_softc *sc = device_get_softc(dev); - - /* eventhandler deregist */ - EVENTHANDLER_DEREGISTER(shutdown_final, sc->canbepm_tag); - BUS_CHILD_DETACHED(device_get_parent(dev), dev); - - return (0); -} diff --git a/sys/pc98/pc98/canbus.c b/sys/pc98/pc98/canbus.c deleted file mode 100644 index 0c54ceb66a94..000000000000 --- a/sys/pc98/pc98/canbus.c +++ /dev/null @@ -1,441 +0,0 @@ -/*- - * Copyright (c) 2000 KIYOHARA Takashi <kiyohara@kk.iij4u.ne.jp> - * Copyright (c) 2000 Takanori Watanabe <takawata@jp.FreeBSD.org> - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * $FreeBSD$ - */ - -#include <sys/param.h> -#include <sys/systm.h> -#include <sys/bus.h> -#include <sys/kernel.h> -#include <sys/malloc.h> -#include <sys/module.h> -#include <sys/sysctl.h> - - -#include <machine/bus.h> -#include <machine/resource.h> -#include <sys/rman.h> - -#include <pc98/pc98/canbus.h> -#include <pc98/pc98/canbusvars.h> -#include "canbus_if.h" - - -#define CANBE_IO_DELAY_TIME 5000 - - -static MALLOC_DEFINE(M_CANBUSDEV, "canbusdev", "CanBe device"); -struct canbus_device { - struct resource_list cbdev_resources; -}; - -/* canbus softc */ -struct canbus_softc { - int io_delay_time; /* CanBe I/O delay time */ - - struct sysctl_ctx_list canbus_sysctl_ctx; - /* dynamic sysctl tree */ - - /* index register */ - int index_id; /* index ID */ - struct resource *index_res; /* index resource */ - bus_space_tag_t index_tag; /* index tag */ - bus_space_handle_t index_handle; /* index handle */ - - /* data register */ - int data_id; /* data ID */ - struct resource *data_res; /* data resource */ - bus_space_tag_t data_tag; /* data tag */ - bus_space_handle_t data_handle; /* data handle */ -}; - - -/* Device interface methods */ -static void canbus_identify(driver_t *, device_t); -static int canbus_probe(device_t); -static int canbus_attach(device_t); -static int canbus_detach(device_t); - -/* Bus interface methods */ -static int canbus_print_child(device_t, device_t); -static device_t canbus_add_child(device_t, u_int, const char *, int); -static struct resource * canbus_alloc_resource( - device_t, device_t, int, int *, rman_res_t, rman_res_t, rman_res_t, u_int); -static int canbus_activate_resource( - device_t, device_t, int, int, struct resource *); -static int canbus_deactivate_resource( - device_t, device_t, int, int, struct resource *); -static int canbus_release_resource( - device_t, device_t, int, int, struct resource *); -static int canbus_set_resource ( - device_t, device_t, int, int, rman_res_t, rman_res_t); -static void canbus_delete_resource(device_t, device_t, int, int); - -/* canbus local function */ -static void set_ioresource(device_t dev); -static void delete_ioresource(device_t dev); -static int alloc_ioresource(device_t); -static void release_ioresource(device_t); -static int print_all_resources(device_t); - -static device_method_t canbus_methods[] = { - /* Device interface */ - DEVMETHOD(device_identify, canbus_identify), - DEVMETHOD(device_probe, canbus_probe), - DEVMETHOD(device_attach, canbus_attach), - DEVMETHOD(device_detach, canbus_detach), - - /* Bus interface */ - DEVMETHOD(bus_print_child, canbus_print_child), - DEVMETHOD(bus_add_child, canbus_add_child), - DEVMETHOD(bus_alloc_resource, canbus_alloc_resource), - DEVMETHOD(bus_activate_resource, canbus_activate_resource), - DEVMETHOD(bus_deactivate_resource, canbus_deactivate_resource), - DEVMETHOD(bus_release_resource, canbus_release_resource), - DEVMETHOD(bus_setup_intr, bus_generic_setup_intr), - DEVMETHOD(bus_teardown_intr, bus_generic_teardown_intr), - DEVMETHOD(bus_set_resource, canbus_set_resource), - DEVMETHOD(bus_delete_resource, canbus_delete_resource), - - /* CanBe interface */ - DEVMETHOD(canbus_read, canbus_read), - DEVMETHOD(canbus_write, canbus_write), - DEVMETHOD(canbus_write_multi, canbus_write_multi), - - {0, 0} -}; - -static driver_t canbus_driver = { - "canbus", - canbus_methods, - sizeof(struct canbus_softc), -}; - -devclass_t canbus_devclass; -DRIVER_MODULE(canbus, nexus, canbus_driver, canbus_devclass, 0, 0); -MODULE_VERSION(canbus, 1); - - -static void -canbus_identify(driver_t *drv, device_t parent) -{ - if (device_find_child(parent, "canbus", 0) == NULL) { - if (BUS_ADD_CHILD(parent, 33, "canbus", 0) == NULL) - device_printf(parent, "canbus cannot attach\n"); - } -} - - -static int -canbus_probe(device_t dev) -{ - u_int8_t flag; - - set_ioresource(dev); - if(alloc_ioresource(dev)) - return (ENXIO); - flag = canbus_read(dev, NULL, CANBE_SOUND_INTR_ADDR); - release_ioresource(dev); - - if (bootverbose) - device_printf(dev, "probe flag = 0x%x\n", flag); - - if (flag != CANBE_SOUND_INTR_VAL0 && flag != CANBE_SOUND_INTR_VAL1 && - flag != CANBE_SOUND_INTR_VAL2 && flag != CANBE_SOUND_INTR_VAL3) { - device_printf(dev, "Device Not Found\n"); - return (ENXIO); - } - device_set_desc(dev, "CanBe I/O Bus"); - - return (0); -} - -static int -canbus_attach(device_t dev) -{ - struct canbus_softc *sc = device_get_softc(dev); - struct sysctl_oid *canbus_sysctl_tree; - - sc->io_delay_time = CANBE_IO_DELAY_TIME; - - /* I/O resource setup */ - if(alloc_ioresource(dev)) - return (ENXIO); - - /* Dynamic sysctl tree setup */ - sysctl_ctx_init(&sc->canbus_sysctl_ctx); - canbus_sysctl_tree = SYSCTL_ADD_ROOT_NODE(&sc->canbus_sysctl_ctx, - OID_AUTO, "canbus", CTLFLAG_RD, 0, "CanBe I/O Bus"); - SYSCTL_ADD_INT(&sc->canbus_sysctl_ctx, - SYSCTL_CHILDREN(canbus_sysctl_tree), OID_AUTO, "io_delay_time", - CTLFLAG_RW, &sc->io_delay_time, 0, "CanBe Bus I/O delay time"); - - bus_generic_probe(dev); - bus_generic_attach(dev); - - return (0); -} - - -static int -canbus_detach(device_t dev) -{ - struct canbus_softc *sc = device_get_softc(dev); - - /* I/O resource free */ - release_ioresource(dev); - delete_ioresource(dev); - - /* Dynamic sysctl tree destroy */ - if (sysctl_ctx_free(&sc->canbus_sysctl_ctx)) { - device_printf(dev, - "can't free this context - other oids depend on it\n"); - return (ENOTEMPTY); - } - - return (0); -} - - -static int -canbus_print_child(device_t dev, device_t child) -{ - int retval = 0; - - retval += bus_print_child_header(dev, child); - retval += print_all_resources(child); - retval += bus_print_child_footer(dev, child); - - return (retval); -} - -static device_t -canbus_add_child(device_t bus, u_int order, const char *name, int unit) -{ - device_t child; - struct canbus_device *cbdev; - - child = device_add_child_ordered(bus, order, name, unit); - - cbdev = malloc( - sizeof(struct canbus_device), M_CANBUSDEV, M_NOWAIT | M_ZERO); - if (!cbdev) - return (0); - - resource_list_init(&cbdev->cbdev_resources); - device_set_ivars(child, cbdev); - - return (child); -} - -static struct resource * -canbus_alloc_resource(device_t dev, device_t child, int type, - int *rid, rman_res_t start, rman_res_t end, rman_res_t count, u_int flags) -{ - return (BUS_ALLOC_RESOURCE(device_get_parent(dev), - child, type, rid, start, end, count, flags)); -} - -static int -canbus_activate_resource( - device_t dev, device_t child, int type, int rid, struct resource *res) -{ - return (BUS_ACTIVATE_RESOURCE( - device_get_parent(dev), child, type, rid, res)); -} - -static int -canbus_deactivate_resource( - device_t dev, device_t child, int type, int rid, struct resource *res) -{ - return (BUS_DEACTIVATE_RESOURCE( - device_get_parent(dev), child, type, rid, res)); -} - -static int -canbus_release_resource( - device_t dev, device_t child, int type, int rid, struct resource *res) -{ - return (BUS_RELEASE_RESOURCE( - device_get_parent(dev), child, type, rid, res)); -} - -static int -canbus_set_resource ( - device_t dev, device_t child, int type, int rid, rman_res_t start, - rman_res_t count) -{ - struct canbus_device *cbdev = - (struct canbus_device *)device_get_ivars(child); - struct resource_list *rl = &cbdev->cbdev_resources; - - resource_list_add(rl, type, rid, start, (start + count - 1), count); - - return (0); -} - -static void -canbus_delete_resource(device_t dev, device_t child, int type, int rid) -{ - struct canbus_device *cbdev = - (struct canbus_device *)device_get_ivars(child); - struct resource_list *rl = &cbdev->cbdev_resources; - - resource_list_delete(rl, type, rid); -} - - -u_int8_t -canbus_read(device_t dev, device_t child, int reg) -{ - struct canbus_softc *sc = device_get_softc(dev); - - bus_space_write_1(sc->index_tag, sc->index_handle, 0, reg); - return (bus_space_read_1(sc->data_tag, sc->data_handle, 0)); -} - -void -canbus_write(device_t dev, device_t child, int reg, u_int8_t val) -{ - struct canbus_softc *sc = device_get_softc(dev); - - bus_space_write_1(sc->index_tag, sc->index_handle, 0, reg); - bus_space_write_1(sc->data_tag, sc->data_handle, 0, val); -} - -void -canbus_write_multi(device_t dev, - device_t child, int reg, const int count, const u_int8_t *vals) -{ - struct canbus_softc *sc = device_get_softc(dev); - int i; - - bus_space_write_1(sc->index_tag, sc->index_handle, 0, reg); - - for (i = 0; i < count; i ++) { - bus_space_write_1(sc->data_tag, sc->data_handle, 0, vals[i]); - DELAY(sc->io_delay_time); - } -} - -void -canbus_delay(device_t dev, device_t child) -{ - struct canbus_softc *sc = device_get_softc(dev); - - DELAY(sc->io_delay_time); -} - - -/* - * canbus local function. - */ - -/* - * CanBe I/O resource set function - */ -static void -set_ioresource(device_t dev) -{ - struct canbus_softc *sc = device_get_softc(dev); - - sc->index_id = 0; - sc->data_id = 1; - - bus_set_resource( - dev, SYS_RES_IOPORT, sc->index_id, CANBE_IOPORT_INDEX, 1); - bus_set_resource( - dev, SYS_RES_IOPORT, sc->data_id, CANBE_IOPORT_DATA, 1); -} - -/* - * CanBe I/O resource delete function - */ -static void -delete_ioresource(device_t dev) -{ - struct canbus_softc *sc = device_get_softc(dev); - - bus_delete_resource(dev, SYS_RES_IOPORT, sc->index_id); - bus_delete_resource(dev, SYS_RES_IOPORT, sc->data_id); -} - -/* - * CanBe I/O resource alloc function - */ -static int -alloc_ioresource(device_t dev) -{ - struct canbus_softc *sc = device_get_softc(dev); - - sc->index_res = bus_alloc_resource_any( - dev, SYS_RES_IOPORT, &sc->index_id, RF_ACTIVE); - sc->data_res = bus_alloc_resource_any( - dev, SYS_RES_IOPORT, &sc->data_id, RF_ACTIVE); - if (sc->index_res == NULL || sc->data_res == NULL) { - device_printf(dev, "could not map I/O\n"); - return (ENXIO); - } - - sc->index_tag = rman_get_bustag(sc->index_res); - sc->index_handle = rman_get_bushandle(sc->index_res); - sc->data_tag = rman_get_bustag(sc->data_res); - sc->data_handle = rman_get_bushandle(sc->data_res); - - return (0); -} - -/* - * CanBe I/O resource release function - */ -static void -release_ioresource(device_t dev) -{ - struct canbus_softc *sc = device_get_softc(dev); - - bus_release_resource(dev, SYS_RES_IOPORT, sc->index_id, sc->index_res); - bus_release_resource(dev, SYS_RES_IOPORT, sc->data_id, sc->data_res); -} - - -static int -print_all_resources(device_t dev) -{ - struct canbus_device *cbdev = - (struct canbus_device *)device_get_ivars(dev); - struct resource_list *rl = &cbdev->cbdev_resources; - int retval = 0; - - if (STAILQ_FIRST(rl)) - retval += printf(" at"); - - retval += resource_list_print_type(rl, "port", SYS_RES_IOPORT, "%#jx"); - retval += resource_list_print_type(rl, "iomem", SYS_RES_MEMORY, "%#jx"); - retval += resource_list_print_type(rl, "irq", SYS_RES_IRQ, "%jd"); - - return retval; -} diff --git a/sys/pc98/pc98/canbus.h b/sys/pc98/pc98/canbus.h deleted file mode 100644 index b63cc765cd6f..000000000000 --- a/sys/pc98/pc98/canbus.h +++ /dev/null @@ -1,39 +0,0 @@ -/*- - * Copyright (c) 2000 KIYOHARA Takashi <kiyohara@kk.iij4u.or.jp> - * Copyright (c) 2000 Takanori Watanabe <takawata@jp.FreeBSD.org> - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * $FreeBSD$ - */ - -#ifndef _PC98_PC98_CANBUS_H_ -#define _PC98_PC98_CANBUS_H_ - -u_int8_t canbus_read(device_t, device_t, int); -void canbus_write(device_t, device_t, int, u_int8_t); -void canbus_write_multi( - device_t, device_t, int, const int, const u_int8_t *); -void canbus_delay(device_t, device_t); - -#endif /* _PC98_PC98_CANBUS_H_ */ diff --git a/sys/pc98/pc98/canbus_if.m b/sys/pc98/pc98/canbus_if.m deleted file mode 100644 index 42d2cd52929c..000000000000 --- a/sys/pc98/pc98/canbus_if.m +++ /dev/null @@ -1,69 +0,0 @@ -#- -# Copyright (c) 2002 KIYOHARA Takashi <kiyohara@kk.iij4u.or.jp> -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions -# are met: -# 1. Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# 2. Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. -# -# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND -# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE -# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -# SUCH DAMAGE. -# -# $FreeBSD$ -# - -#include <sys/bus.h> - -INTERFACE canbus; - -# -# CanBe I/O read -# -METHOD u_int8_t read { - device_t dev; - device_t child; - int reg; -}; - -# -# CanBe I/O write -# -METHOD void write { - device_t dev; - device_t child; - int reg; - u_int8_t val; -}; - -# -# CanBe I/O write multi bytes -# -METHOD void write_multi { - device_t dev; - device_t child; - int reg; - const int count; - const u_int8_t * vals; -}; - -# -# CanBe I/O delay -# -METHOD void delay { - device_t dev; - device_t child; -}; diff --git a/sys/pc98/pc98/canbusvars.h b/sys/pc98/pc98/canbusvars.h deleted file mode 100644 index fc2acc11a976..000000000000 --- a/sys/pc98/pc98/canbusvars.h +++ /dev/null @@ -1,110 +0,0 @@ -/*- - * Copyright (c) 2000 KIYOHARA Takashi <kiyohara@kk.iij4u.or.jp> - * Copyright (c) 2000 Takanori Watanabe <takawata@jp.FreeBSD.org> - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * $FreeBSD$ - */ - -#ifndef _PC98_PC98_CANBUSVARS_H_ -#define _PC98_PC98_CANBUSVARS_H_ - - -/* CanBe I/O register */ -#define CANBE_IOPORT_INDEX 0xf4a -#define CANBE_IOPORT_DATA 0xf4b - -/* - * following registor purpose for spending -- unknown. - */ -#define CANBE_IOPORT1 0x0c24 -#define CANBE_IOPORT2 0x0c2b -#define CANBE_IOPORT3 0x0c2d - - -/* CanBe register number */ -#define CANBE_SOUND_INTR_ADDR 0x01 -#define CANBE_RC_RESET 0x03 -#define CANBE_MUTE_CTRL 0x04 -#define CANBE_RC_DATA_STATUS 0x10 -#define CANBE_RC_RECV_CODE 0x11 -#define CANBE_POWER_CTRL 0x13 -#define CANBE_RC_USED_INTR 0x14 - - -/* CanBe sound interrupt address value */ -#define CANBE_SOUND_INTR_VAL0 0x00 -#define CANBE_SOUND_INTR_VAL1 0x02 -#define CANBE_SOUND_INTR_VAL2 0x03 -#define CANBE_SOUND_INTR_VAL3 0x08 - -/* CanBe remote controler reset */ -#define CANBE_MIKE_THRUE 0x04 -#define CANBE_CTRLR_RESET 0x01 - -/* CanBe mute control */ -#define CANBE_MUTE 0x01 - -/* CanBe remote controler data status */ -#define CANBE_RC_BUSY 0x02 -#define CANBE_RC_STATUS 0x01 - -/* CanBe remote controler receive code */ -#define CANBE_RC_DATA_CHUP 0x00 -#define CANBE_RC_DATA_CHDOWN 0x01 -#define CANBE_RC_DATA_VOLUP 0x02 -#define CANBE_RC_DATA_VOLDOWN 0x03 -#define CANBE_RC_DATA_EJECT 0x04 -#define CANBE_RC_DATA_PLAY 0x05 -#define CANBE_RC_DATA_MUTE 0x09 -#define CANBE_RC_DATA_VIDEO 0x0a -#define CANBE_RC_DATA_NEXT 0x0c -#define CANBE_RC_DATA_PREVIOUS 0x0d -#define CANBE_RC_DATA_M_S 0x1d -#define CANBE_RC_DATA_UP 0x40 -#define CANBE_RC_DATA_DOWN 0x41 -#define CANBE_RC_DATA_LEFT 0x42 -#define CANBE_RC_DATA_RIGHT 0x43 -#define CANBE_RC_DATA_SIZE 0x4d -#define CANBE_RC_DATA_ESC 0x4e -#define CANBE_RC_DATA_CR 0x4f -#define CANBE_RC_DATA_TV 0x53 -#define CANBE_RC_DATA_FREEZE 0x5d -#define CANBE_RC_DATA_CAPTURE 0x5e - -/* CanBe power off data */ -#define CANBE_POWEROFF_DATA { \ - 0x80, 0x06, 0x00, 0x00, \ - 0x80, 0x07, 0x00, 0x01, \ - 0x80, 0x01, 0x00, 0x00 \ -} - -/* CanBe remote controler used intr */ -#define CANBE_RC_INTR 0x04 -#define CANBE_RC_INTR_INT41 0x03 /* irq 10 */ -#define CANBE_RC_INTR_INT1 0x02 /* irq 5 */ -#define CANBE_RC_INTR_INT2 0x01 /* irq 6 */ -#define CANBE_RC_INTR_INT0 0x00 /* irq 3 */ - -#endif /* _PC98_PC98_CANBUSVARS_H_ */ diff --git a/sys/pc98/pc98/genassym.c b/sys/pc98/pc98/genassym.c deleted file mode 100644 index 26858e5e149a..000000000000 --- a/sys/pc98/pc98/genassym.c +++ /dev/null @@ -1,3 +0,0 @@ -/* $FreeBSD$ */ - -#include "../../i386/i386/genassym.c" diff --git a/sys/pc98/pc98/pc98_machdep.c b/sys/pc98/pc98/pc98_machdep.c deleted file mode 100644 index 9f9fbcc347f2..000000000000 --- a/sys/pc98/pc98/pc98_machdep.c +++ /dev/null @@ -1,320 +0,0 @@ -/*- - * Copyright (c) KATO Takenori, 1996, 1997. - * - * All rights reserved. Unpublished rights reserved under the copyright - * laws of Japan. - * - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer as - * the first lines of this file unmodified. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD$ - */ - -#include "opt_pc98.h" - -#include <sys/param.h> -#include <sys/systm.h> - -#include <sys/bio.h> -#include <sys/bus.h> -#include <sys/conf.h> -#include <sys/kernel.h> -#include <sys/sysctl.h> -#include <cam/cam.h> -#include <cam/cam_ccb.h> -#include <geom/geom_disk.h> -#include <machine/md_var.h> -#include <pc98/pc98/pc98_machdep.h> - -static int ad_geom_method = AD_GEOM_ADJUST_COMPATIDE; - -SYSCTL_INT(_machdep, OID_AUTO, ad_geom_method, CTLFLAG_RWTUN, &ad_geom_method, 0, - "IDE disk geometry conversion method"); - -/* - * Initialize DMA controller - */ -void -pc98_init_dmac(void) -{ - outb(0x439, (inb(0x439) & 0xfb)); /* DMA Accsess Control over 1MB */ - outb(0x29, (0x0c | 0)); /* Bank Mode Reg. 16M mode */ - outb(0x29, (0x0c | 1)); /* Bank Mode Reg. 16M mode */ - outb(0x29, (0x0c | 2)); /* Bank Mode Reg. 16M mode */ - outb(0x29, (0x0c | 3)); /* Bank Mode Reg. 16M mode */ - outb(0x11, 0x50); -} - -#ifdef EPSON_MEMWIN -/* - * Disconnect phisical memory in 15-16MB region. - * - * EPSON PC-486GR, P, SR, SE, HX, HG and HA only. Other system support - * this feature with software DIP switch. - */ -static void -init_epson_memwin(void) -{ - /* Disable 15MB-16MB caching. */ - switch (epson_machine_id) { - case EPSON_PC486_HX: - case EPSON_PC486_HG: - case EPSON_PC486_HA: - /* Cache control start. */ - outb(0x43f, 0x42); - outw(0xc40, 0x0033); - - /* Disable 0xF00000-0xFFFFFF. */ - outb(0xc48, 0x49); - outb(0xc4c, 0x00); - outb(0xc48, 0x48); - outb(0xc4c, 0xf0); - outb(0xc48, 0x4d); - outb(0xc4c, 0x00); - outb(0xc48, 0x4c); - outb(0xc4c, 0xff); - outb(0xc48, 0x4f); - outb(0xc4c, 0x00); - - /* Cache control end. */ - outb(0x43f, 0x40); - break; - - case EPSON_PC486_GR: - case EPSON_PC486_P: - case EPSON_PC486_GR_SUPER: - case EPSON_PC486_GR_PLUS: - case EPSON_PC486_SE: - case EPSON_PC486_SR: - /* Disable 0xF00000-0xFFFFFF. */ - outb(0x43f, 0x42); - outb(0x467, 0xe0); - outb(0x567, 0xd8); - - outb(0x43f, 0x40); - outb(0x467, 0xe0); - outb(0x567, 0xe0); - break; - } - - /* Disable 15MB-16MB RAM and enable memory window. */ - outb(0x43b, inb(0x43b) & 0xfd); /* Clear bit1. */ -} -#endif - -/* - * Get physical memory size - */ -unsigned int -pc98_getmemsize(unsigned int *base, unsigned int *ext) -{ - unsigned int under16, over16; - - /* available conventional memory size */ - *base = ((PC98_SYSTEM_PARAMETER(0x501) & 7) + 1) * 128; - - /* available protected memory size under 16MB */ - under16 = PC98_SYSTEM_PARAMETER(0x401) * 128 + 1024; -#ifdef EPSON_MEMWIN - if (pc98_machine_type & M_EPSON_PC98) { - if (under16 > (15 * 1024)) - /* chop under16 memory to 15MB */ - under16 = 15 * 1024; - init_epson_memwin(); - } -#endif - - /* available protected memory size over 16MB / 1MB */ - over16 = PC98_SYSTEM_PARAMETER(0x594); - over16 += PC98_SYSTEM_PARAMETER(0x595) * 256; - - if (over16 > 0) - *ext = (16 + over16) * 1024 - 1024; - else - *ext = under16 - 1024; - - return (under16); -} - -/* - * Read a geometry information of SCSI HDD from BIOS work area. - * - * XXX - Before reading BIOS work area, we should check whether - * host adapter support it. - */ -int -scsi_da_bios_params(struct ccb_calc_geometry *ccg) -{ - u_char *tmp; - int target; - - target = ccg->ccb_h.target_id; - tmp = (u_char *)&PC98_SYSTEM_PARAMETER(0x460 + target*4); - if ((PC98_SYSTEM_PARAMETER(0x482) & ((1 << target)&0xff)) != 0) { - ccg->secs_per_track = *tmp; - ccg->cylinders = ((*(tmp+3)<<8)|*(tmp+2))&0xfff; -#if 0 - switch (*(tmp + 3) & 0x30) { - case 0x00: - disk_parms->secsiz = 256; - printf("Warning!: not supported.\n"); - break; - case 0x10: - disk_parms->secsiz = 512; - break; - case 0x20: - disk_parms->secsiz = 1024; - break; - default: - disk_parms->secsiz = 512; - printf("Warning!: not supported. But force to 512\n"); - break; - } -#endif - if (*(tmp+3) & 0x40) { - ccg->cylinders += (*(tmp+1)&0xf0)<<8; - ccg->heads = *(tmp+1)&0x0f; - } else { - ccg->heads = *(tmp+1); - } - return (1); - } - - return (0); -} - -/* - * Adjust the geometry of the IDE HDD. - */ - -/* IDE BIOS compatible mode. */ -static void -pc98_ata_disk_geom_adjust_idebios(struct disk *disk) -{ - - if (disk->d_mediasize < MEDIASIZE_4_3G) { - disk->d_fwsectors = 17; - disk->d_fwheads = 8; - } else if (disk->d_mediasize < MEDIASIZE_29_5G) { - disk->d_fwsectors = 63; - if (disk->d_fwheads != 15) /* Allow 15H63S. */ - disk->d_fwheads = 16; - } else if (disk->d_mediasize < MEDIASIZE_31_5G) { - disk->d_fwsectors = 63; - disk->d_fwheads = 16; - } else if (disk->d_mediasize < MEDIASIZE_127G) { - disk->d_fwsectors = 255; - disk->d_fwheads = 16; - } else { - /* XXX */ - disk->d_fwsectors = 255; - disk->d_fwheads = 255; - } -} - -/* SCSI BIOS compatible mode. */ -static void -pc98_ata_disk_geom_adjust_scsibios(struct disk *disk) -{ - - if (disk->d_mediasize < MEDIASIZE_8G) { - disk->d_fwsectors = 32; - disk->d_fwheads = 8; - } else if (disk->d_mediasize < MEDIASIZE_32G) { - disk->d_fwsectors = 128; - disk->d_fwheads = 8; - } else if (disk->d_mediasize < MEDIASIZE_60G) { - /* Compatible with IFC-USP 1.2. */ - disk->d_fwsectors = 128; - disk->d_fwheads = 15; - } else if (disk->d_mediasize < MEDIASIZE_120G) { - disk->d_fwsectors = 255; - disk->d_fwheads = 15; - } else { - /* XXX */ - disk->d_fwsectors = 255; - disk->d_fwheads = 255; - } -} - -/* Compatible with the revision 1.28. */ -static void -pc98_ata_disk_geom_adjust_cyl16bit(struct disk *disk) -{ - off_t totsec = disk->d_mediasize / disk->d_sectorsize; - off_t cyl = totsec / disk->d_fwsectors / disk->d_fwheads; - - /* - * It is impossible to have more than 65535 cylinders, so if - * we have more then try to adjust. This is lame, but it is - * only POC. - */ - if (cyl > 65355) { - if (totsec < 17*8*65535) { - disk->d_fwsectors = 17; - disk->d_fwheads = 8; - } else if (totsec < 63*16*65535) { - disk->d_fwsectors = 63; - disk->d_fwheads = 16; - } else if (totsec < 255*16*65535) { - disk->d_fwsectors = 255; - disk->d_fwheads = 16; - } else { - disk->d_fwsectors = 255; - disk->d_fwheads = 255; - } - } -} - -void -pc98_ata_disk_firmware_geom_adjust(struct disk *disk) -{ - u_int oldsectors, oldheads; - - oldsectors = disk->d_fwsectors; - oldheads = disk->d_fwheads; - - switch (ad_geom_method) { - case AD_GEOM_ADJUST_COMPATIDE: - pc98_ata_disk_geom_adjust_idebios(disk); - break; - case AD_GEOM_ADJUST_COMPATSCSI: - pc98_ata_disk_geom_adjust_scsibios(disk); - break; - case AD_GEOM_ADJUST_COMPATCYL16: - pc98_ata_disk_geom_adjust_cyl16bit(disk); - break; - default: - /* Do nothing. */ - break; - } - - if (bootverbose && - (oldsectors != disk->d_fwsectors || oldheads != disk->d_fwheads)) - printf( - "%s%d: geometry adjusted from [%dH/%dS] to [%dH/%dS]\n", - disk->d_name, disk->d_unit, - oldheads, oldsectors, - disk->d_fwheads, disk->d_fwsectors); -} diff --git a/sys/pc98/pc98/pc98_machdep.h b/sys/pc98/pc98/pc98_machdep.h deleted file mode 100644 index 6cbdaad1e018..000000000000 --- a/sys/pc98/pc98/pc98_machdep.h +++ /dev/null @@ -1,102 +0,0 @@ -/*- - * Copyright (c) KATO Takenori, 1996. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer as - * the first lines of this file unmodified. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD$ - */ - -#ifndef __PC98_PC98_PC98_MACHDEP_H__ -#define __PC98_PC98_PC98_MACHDEP_H__ - -void pc98_init_dmac(void); -unsigned int pc98_getmemsize(unsigned *, unsigned *); - -#define PC98_VECTOR_SIZE (0x400) -#define PC98_SYSTEM_PARAMETER_SIZE (0x240) -#define PC98_SAVE_AREA (0xa1000) - -#if defined(_KERNEL) && !defined(LOCORE) -/* BIOS parameter block */ -extern unsigned char pc98_system_parameter[]; /* in locore.c */ - -#define OFS_pc98_machine_type 0x220 -#define OFS_epson_machine_id 0x224 -#define OFS_epson_bios_id 0x225 -#define OFS_epson_system_type 0x226 - -#define PC98_SYSTEM_PARAMETER(x) pc98_system_parameter[(x)-0x400] -#define pc98_machine_type (*(unsigned long*)&pc98_system_parameter[OFS_pc98_machine_type]) -#define epson_machine_id (pc98_system_parameter[OFS_epson_machine_id]) -#define epson_bios_id (pc98_system_parameter[OFS_epson_bios_id]) -#define epson_system_type (pc98_system_parameter[OFS_epson_system_type]) - -# define PC98_TYPE_CHECK(x) ((pc98_machine_type & (x)) == (x)) - -/* - * PC98 machine type - */ -#define M_NEC_PC98 0x0001 -#define M_EPSON_PC98 0x0002 -#define M_NOT_H98 0x0010 -#define M_H98 0x0020 -#define M_NOTE 0x0040 -#define M_NORMAL 0x1000 -#define M_8M 0x8000 - -/* - * EPSON machine list - */ -#define EPSON_PC386_NOTE_A 0x20 -#define EPSON_PC386_NOTE_W 0x22 -#define EPSON_PC386_NOTE_AE 0x27 -#define EPSON_PC386_NOTE_WR 0x2a -#define EPSON_PC486_GR 0x2b -#define EPSON_PC486_P 0x30 -#define EPSON_PC486_GR_SUPER 0x31 -#define EPSON_PC486_GR_PLUS 0x32 -#define EPSON_PC486_HX 0x34 -#define EPSON_PC486_HG 0x35 -#define EPSON_PC486_SE 0x37 -#define EPSON_PC486_SR 0x38 -#define EPSON_PC486_HA 0x3b - -/* IDE HDD geometry conversion. */ -#define AD_GEOM_ADJUST_NONE 0 /* Do nothing. */ -#define AD_GEOM_ADJUST_COMPATIDE 1 /* PC-98 IDE BIOS. */ -#define AD_GEOM_ADJUST_COMPATSCSI 2 /* PC-98 SCSI. */ -#define AD_GEOM_ADJUST_COMPATCYL16 100 /* Compat Rev. 1.28. */ - -#define MEDIASIZE_4_3G (4351LL * 1024LL * 1024LL) /* 4351M */ -#define MEDIASIZE_8G (8192LL * 1024LL * 1024LL) /* 8192M */ -#define MEDIASIZE_29_5G (30239LL * 1024LL * 1024LL) /* 30239M */ -#define MEDIASIZE_31_5G (32255LL * 1024 * 1024) /* 32255M */ -#define MEDIASIZE_32G (32768LL * 1024LL * 1024LL) /* 32768M */ -#define MEDIASIZE_60G (61440LL * 1024LL * 1024LL) /* 61440M */ -#define MEDIASIZE_120G (122400LL * 1024LL * 1024LL) /* 122400M */ -#define MEDIASIZE_127G (130558LL * 1024LL * 1024LL) /* 130558M */ - -#endif /* _KERNEL */ - -#endif /* __PC98_PC98_PC98_MACHDEP_H__ */ diff --git a/sys/sys/cdefs.h b/sys/sys/cdefs.h index 179a60955d1c..8eec7f9c5107 100644 --- a/sys/sys/cdefs.h +++ b/sys/sys/cdefs.h @@ -375,14 +375,6 @@ #define __noinline #endif -#if __GNUC_PREREQ__(3, 3) -#define __nonnull(x) __attribute__((__nonnull__(x))) -#define __nonnull_all __attribute__((__nonnull__)) -#else -#define __nonnull(x) -#define __nonnull_all -#endif - #if __GNUC_PREREQ__(3, 4) #define __fastcall __attribute__((__fastcall__)) #define __result_use_check __attribute__((__warn_unused_result__)) diff --git a/sys/sys/consio.h b/sys/sys/consio.h index a2b035cada62..d2108deba78d 100644 --- a/sys/sys/consio.h +++ b/sys/sys/consio.h @@ -405,12 +405,6 @@ typedef struct vt_mode vtmode_t; #define SW_VGA_CG640 _IO('S', M_VGA_CG640) #define SW_VGA_MODEX _IO('S', M_VGA_MODEX) -#define SW_PC98_80x25 _IO('S', M_PC98_80x25) -#define SW_PC98_80x30 _IO('S', M_PC98_80x30) -#define SW_PC98_EGC640x400 _IO('S', M_PC98_EGC640x400) -#define SW_PC98_PEGC640x400 _IO('S', M_PC98_PEGC640x400) -#define SW_PC98_PEGC640x480 _IO('S', M_PC98_PEGC640x480) - #define SW_VGA_C90x25 _IO('S', M_VGA_C90x25) #define SW_VGA_M90x25 _IO('S', M_VGA_M90x25) #define SW_VGA_C90x30 _IO('S', M_VGA_C90x30) diff --git a/sys/sys/copyright.h b/sys/sys/copyright.h index e9c19881f284..e3b94303f1d5 100644 --- a/sys/sys/copyright.h +++ b/sys/sys/copyright.h @@ -44,14 +44,5 @@ #define COPYRIGHT_UCB \ "Copyright (c) 1979, 1980, 1983, 1986, 1988, 1989, 1991, 1992, 1993, 1994\n\tThe Regents of the University of California. All rights reserved.\n" -/* a port of FreeBSD to the NEC PC98, Japan */ -#if defined(PC98) -#define COPYRIGHT_PC98 \ - "Copyright (c) 1994-2003 FreeBSD(98) porting team.\nCopyright (c) 1992 A.Kojima F.Ukai M.Ishii (KMC).\n" -#else -#define COPYRIGHT_PC98 -#endif - -char copyright[] = COPYRIGHT_Vendor COPYRIGHT_FreeBSD COPYRIGHT_PC98 \ - COPYRIGHT_UCB; +char copyright[] = COPYRIGHT_Vendor COPYRIGHT_FreeBSD COPYRIGHT_UCB; char trademark[] = TRADEMARK_Foundation; diff --git a/sys/sys/disk/pc98.h b/sys/sys/disk/pc98.h deleted file mode 100644 index c5ff46c0a584..000000000000 --- a/sys/sys/disk/pc98.h +++ /dev/null @@ -1,75 +0,0 @@ -/*- - * Copyright (c) 1987, 1988, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)disklabel.h 8.2 (Berkeley) 7/10/94 - * $FreeBSD$ - */ - -#ifndef _SYS_DISK_PC98_H_ -#define _SYS_DISK_PC98_H_ - -#define PC98_BBSECTOR 1 /* DOS boot block relative sector number */ -#define PC98_PARTOFF 0 -#define PC98_PARTSIZE 32 -#define PC98_NPARTS 16 -#define PC98_MAGICOFS 510 -#define PC98_MAGIC 0xAA55 - -#define PC98_MID_BOOTABLE 0x80 -#define PC98_MID_MASK 0x7f -#define PC98_MID_386BSD 0x14 - -#define PC98_SID_ACTIVE 0x80 -#define PC98_SID_MASK 0x7f -#define PC98_SID_386BSD 0x44 - -#define __DOSMID_386BSD (PC98_MID_386BSD | PC98_MID_BOOTABLE) -#define __DOSSID_386BSD (PC98_SID_386BSD | PC98_SID_ACTIVE) -#define PC98_PTYP_386BSD (__DOSSID_386BSD << 8 | __DOSMID_386BSD) - -struct pc98_partition { - unsigned char dp_mid; - unsigned char dp_sid; - unsigned char dp_dum1; - unsigned char dp_dum2; - unsigned char dp_ipl_sct; - unsigned char dp_ipl_head; - unsigned short dp_ipl_cyl; - unsigned char dp_ssect; /* starting sector */ - unsigned char dp_shd; /* starting head */ - unsigned short dp_scyl; /* starting cylinder */ - unsigned char dp_esect; /* end sector */ - unsigned char dp_ehd; /* end head */ - unsigned short dp_ecyl; /* end cylinder */ - unsigned char dp_name[16]; -}; -#ifdef CTASSERT -CTASSERT(sizeof (struct pc98_partition) == PC98_PARTSIZE); -#endif - -#endif /* !_SYS_DISK_PC98_H_ */ diff --git a/sys/sys/diskpc98.h b/sys/sys/diskpc98.h deleted file mode 100644 index 5b75df7016b7..000000000000 --- a/sys/sys/diskpc98.h +++ /dev/null @@ -1,47 +0,0 @@ -/*- - * Copyright (c) 1987, 1988, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)disklabel.h 8.2 (Berkeley) 7/10/94 - * $FreeBSD$ - */ - -#ifndef _SYS_DISKPC98_H_ -#define _SYS_DISKPC98_H_ - -#include <sys/disk/pc98.h> -#include <sys/ioccom.h> - -#define DOSMID_386BSD __DOSMID_386BSD -#define DOSSID_386BSD __DOSSID_386BSD - -void pc98_partition_dec(void const *pp, struct pc98_partition *d); -void pc98_partition_enc(void *pp, struct pc98_partition *d); - -#define DIOCSPC98 _IOW('M', 129, u_char[8192]) - -#endif /* !_SYS_DISKPC98_H_ */ diff --git a/sys/sys/eventhandler.h b/sys/sys/eventhandler.h index 0f0665ccb947..b071c63926ee 100644 --- a/sys/sys/eventhandler.h +++ b/sys/sys/eventhandler.h @@ -284,11 +284,4 @@ typedef void (*swapoff_fn)(void *, struct swdevt *); EVENTHANDLER_DECLARE(swapon, swapon_fn); EVENTHANDLER_DECLARE(swapoff, swapoff_fn); -/* ifup/ifdown events */ -#define IFNET_EVENT_UP 0 -#define IFNET_EVENT_DOWN 1 -struct ifnet; -typedef void (*ifnet_event_fn)(void *, struct ifnet *ifp, int event); -EVENTHANDLER_DECLARE(ifnet_event, ifnet_event_fn); - #endif /* _SYS_EVENTHANDLER_H_ */ diff --git a/sys/sys/fbio.h b/sys/sys/fbio.h index b0779061fa9c..b64a63708d51 100644 --- a/sys/sys/fbio.h +++ b/sys/sys/fbio.h @@ -82,7 +82,6 @@ #define FBTYPE_CGA 22 #define FBTYPE_EGA 23 #define FBTYPE_VGA 24 -#define FBTYPE_PC98 25 #define FBTYPE_TGA 26 #define FBTYPE_TGA2 27 @@ -381,7 +380,6 @@ struct video_adapter { #define KD_CGA 3 /* color graphics adapter */ #define KD_EGA 4 /* enhanced graphics adapter */ #define KD_VGA 5 /* video graphics adapter */ -#define KD_PC98 6 /* PC-98 display */ #define KD_TGA 7 /* TGA */ #define KD_TGA2 8 /* TGA2 */ char *va_name; @@ -520,12 +518,6 @@ typedef struct video_adapter_info video_adapter_info_t; #define M_ENH_B80x43 0x70 /* ega black & white 80x43 */ #define M_ENH_C80x43 0x71 /* ega color 80x43 */ -#define M_PC98_80x25 98 /* PC98 text 80x25 */ -#define M_PC98_80x30 99 /* PC98 text 80x30 */ -#define M_PC98_EGC640x400 100 /* PC98 graphic 640x400 16 colors */ -#define M_PC98_PEGC640x400 101 /* PC98 graphic 640x400 256 colors */ -#define M_PC98_PEGC640x480 102 /* PC98 graphic 640x480 256 colors */ - #define M_HGC_P0 0xe0 /* hercules graphics - page 0 @ B0000 */ #define M_HGC_P1 0xe1 /* hercules graphics - page 1 @ B8000 */ #define M_MCA_MODE 0xff /* monochrome adapter mode */ diff --git a/sys/sys/fdcio.h b/sys/sys/fdcio.h index 341bbd0e40eb..4a497f502c60 100644 --- a/sys/sys/fdcio.h +++ b/sys/sys/fdcio.h @@ -130,10 +130,6 @@ enum fd_drivetype { #define FD_GOPTS _IOR('F', 64, int) /* drive options, see below */ #define FD_SOPTS _IOW('F', 65, int) - -#ifdef PC98 -#define FD_DEBUG _IOW('F', 66, int) -#endif #define FD_CLRERR _IO('F', 67) /* clear error counter */ @@ -152,10 +148,6 @@ enum fd_drivetype { #define FDOPT_NOERRLOG 0x002 /* no "hard error" kernel log messages */ #define FDOPT_NOERROR 0x0004 /* do not indicate errors, caller will use FD_GSTAT in order to obtain status */ -#ifdef PC98 -#define FDOPT_AUTOSEL 0x8000 /* read/only option: device performs media - * autoselection */ -#endif /* * Transfer rate definitions. Used in the structures above. They @@ -180,19 +172,6 @@ enum fd_drivetype { * XXX: but the kernel needs some of them for proper defaults and it would * XXX: should have been done 20 years ago to make sense. */ -#ifdef PC98 -#define FDF_3_1440 18,2,0xFF,0x1B,80,0,2,2,0x54,1,0,FL_MFM -#define FDF_3_1200 15,2,0xFF,0x1B,80,0,0,2,0x54,1,0,FL_MFM -#define FDF_3_720 9,2,0xFF,0x20,80,0,1,2,0x50,1,0,FL_MFM -#define FDF_3_360 9,2,0xFF,0x20,40,0,1,2,0x50,1,0,FL_MFM|FL_2STEP -#define FDF_3_640 8,2,0xFF,0x2A,80,0,1,2,0x50,1,0,FL_MFM -#define FDF_3_1230 8,3,0xFF,0x35,77,0,0,2,0x74,1,0,FL_MFM -#define FDF_5_1200 15,2,0xFF,0x1B,80,0,0,2,0x54,1,0,FL_MFM -#define FDF_5_720 9,2,0xFF,0x20,80,0,1,2,0x50,1,0,FL_MFM -#define FDF_5_360 9,2,0xFF,0x20,40,0,1,2,0x50,1,0,FL_MFM|FL_2STEP -#define FDF_5_640 8,2,0xFF,0x2A,80,0,1,2,0x50,1,0,FL_MFM -#define FDF_5_1230 8,3,0xFF,0x35,77,0,0,2,0x74,1,0,FL_MFM -#else /* PC98 */ #define FDF_3_2880 36,2,0xFF,0x1B,80,0,FDC_1MBPS,002,0x4C,1,1,FL_MFM|FL_PERPND #define FDF_3_1722 21,2,0xFF,0x04,82,0,FDC_500KBPS,2,0x0C,2,0,FL_MFM #define FDF_3_1476 18,2,0xFF,0x1B,82,0,FDC_500KBPS,2,0x6C,1,0,FL_MFM @@ -212,6 +191,5 @@ enum fd_drivetype { #define FDF_5_400 10,2,0xFF,0x10,80,0,FDC_300KBPS,1,0x2e,1,0,FL_MFM /* RX50 */ #define FDF_5_360 9,2,0xFF,0x23,40,0,FDC_300KBPS,2,0x50,1,0,FL_MFM /* XXX: 0x2a ? */ -#endif #endif /* !_MACHINE_IOCTL_FD_H_ */ diff --git a/sys/sys/syscallsubr.h b/sys/sys/syscallsubr.h index eff7aca1f18a..7df9570db70f 100644 --- a/sys/sys/syscallsubr.h +++ b/sys/sys/syscallsubr.h @@ -52,7 +52,6 @@ struct ogetdirentries_args; struct rlimit; struct rusage; union semun; -struct sendfile_args; struct sockaddr; struct stat; struct thr_param; @@ -197,8 +196,6 @@ int kern_semctl(struct thread *td, int semid, int semnum, int cmd, union semun *arg, register_t *rval); int kern_select(struct thread *td, int nd, fd_set *fd_in, fd_set *fd_ou, fd_set *fd_ex, struct timeval *tvp, int abi_nfdbits); -int kern_sendfile(struct thread *td, struct sendfile_args *uap, - struct uio *hdr_uio, struct uio *trl_uio, int compat); int kern_sendit(struct thread *td, int s, struct msghdr *mp, int flags, struct mbuf *control, enum uio_seg segflg); int kern_setgroups(struct thread *td, u_int ngrp, gid_t *groups); diff --git a/sys/sys/systm.h b/sys/sys/systm.h index 6537b7bbbdc1..2329621b5ae4 100644 --- a/sys/sys/systm.h +++ b/sys/sys/systm.h @@ -45,6 +45,8 @@ #include <sys/queue.h> #include <sys/stdint.h> /* for people using printf mainly */ +__NULLABILITY_PRAGMA_PUSH + extern int cold; /* nonzero if we are doing a cold boot */ extern int suspend_blocked; /* block suspend due to pending shutdown */ extern int rebooting; /* kern_reboot() has been called. */ @@ -233,12 +235,12 @@ int vsnprintf(char *, size_t, const char *, __va_list) __printflike(3, 0); int vsnrprintf(char *, size_t, int, const char *, __va_list) __printflike(4, 0); int vsprintf(char *buf, const char *, __va_list) __printflike(2, 0); int ttyprintf(struct tty *, const char *, ...) __printflike(2, 3); -int sscanf(const char *, char const *, ...) __nonnull(1) __nonnull(2) __scanflike(2, 3); -int vsscanf(const char *, char const *, __va_list) __nonnull(1) __nonnull(2) __scanflike(2, 0); -long strtol(const char *, char **, int) __nonnull(1); -u_long strtoul(const char *, char **, int) __nonnull(1); -quad_t strtoq(const char *, char **, int) __nonnull(1); -u_quad_t strtouq(const char *, char **, int) __nonnull(1); +int sscanf(const char *, char const * _Nonnull, ...) __scanflike(2, 3); +int vsscanf(const char * _Nonnull, char const * _Nonnull, __va_list) __scanflike(2, 0); +long strtol(const char *, char **, int); +u_long strtoul(const char *, char **, int); +quad_t strtoq(const char *, char **, int); +u_quad_t strtouq(const char *, char **, int); void tprintf(struct proc *p, int pri, const char *, ...) __printflike(3, 4); void vtprintf(struct proc *, int, const char *, __va_list) __printflike(3, 0); void hexdump(const void *ptr, int length, const char *hdr, int flags); @@ -249,27 +251,27 @@ void hexdump(const void *ptr, int length, const char *hdr, int flags); #define HD_OMIT_CHARS (1 << 18) #define ovbcopy(f, t, l) bcopy((f), (t), (l)) -void bcopy(const void *from, void *to, size_t len) __nonnull(1) __nonnull(2); -void bzero(void *buf, size_t len) __nonnull(1); -void explicit_bzero(void *, size_t) __nonnull(1); - -void *memcpy(void *to, const void *from, size_t len) __nonnull(1) __nonnull(2); -void *memmove(void *dest, const void *src, size_t n) __nonnull(1) __nonnull(2); - -int copystr(const void * __restrict kfaddr, void * __restrict kdaddr, - size_t len, size_t * __restrict lencopied) - __nonnull(1) __nonnull(2); -int copyinstr(const void * __restrict udaddr, void * __restrict kaddr, - size_t len, size_t * __restrict lencopied) - __nonnull(1) __nonnull(2); -int copyin(const void * __restrict udaddr, void * __restrict kaddr, - size_t len) __nonnull(1) __nonnull(2); -int copyin_nofault(const void * __restrict udaddr, void * __restrict kaddr, - size_t len) __nonnull(1) __nonnull(2); -int copyout(const void * __restrict kaddr, void * __restrict udaddr, - size_t len) __nonnull(1) __nonnull(2); -int copyout_nofault(const void * __restrict kaddr, void * __restrict udaddr, - size_t len) __nonnull(1) __nonnull(2); +void bcopy(const void * _Nonnull from, void * _Nonnull to, size_t len); +void bzero(void * _Nonnull buf, size_t len); +void explicit_bzero(void * _Nonnull, size_t); + +void *memcpy(void * _Nonnull to, const void * _Nonnull from, size_t len); +void *memmove(void * _Nonnull dest, const void * _Nonnull src, size_t n); + +int copystr(const void * _Nonnull __restrict kfaddr, + void * _Nonnull __restrict kdaddr, size_t len, + size_t * __restrict lencopied); +int copyinstr(const void * __restrict udaddr, + void * _Nonnull __restrict kaddr, size_t len, + size_t * __restrict lencopied); +int copyin(const void * _Nonnull __restrict udaddr, + void * _Nonnull __restrict kaddr, size_t len); +int copyin_nofault(const void * _Nonnull __restrict udaddr, + void * _Nonnull __restrict kaddr, size_t len); +int copyout(const void * _Nonnull __restrict kaddr, + void * _Nonnull __restrict udaddr, size_t len); +int copyout_nofault(const void * _Nonnull __restrict kaddr, + void * _Nonnull __restrict udaddr, size_t len); int fubyte(volatile const void *base); long fuword(volatile const void *base); @@ -380,16 +382,16 @@ static __inline void splx(intrmask_t ipl __unused) { return; } * Common `proc' functions are declared here so that proc.h can be included * less often. */ -int _sleep(void *chan, struct lock_object *lock, int pri, const char *wmesg, - sbintime_t sbt, sbintime_t pr, int flags) __nonnull(1); +int _sleep(void * _Nonnull chan, struct lock_object *lock, int pri, + const char *wmesg, sbintime_t sbt, sbintime_t pr, int flags); #define msleep(chan, mtx, pri, wmesg, timo) \ _sleep((chan), &(mtx)->lock_object, (pri), (wmesg), \ tick_sbt * (timo), 0, C_HARDCLOCK) #define msleep_sbt(chan, mtx, pri, wmesg, bt, pr, flags) \ _sleep((chan), &(mtx)->lock_object, (pri), (wmesg), (bt), (pr), \ (flags)) -int msleep_spin_sbt(void *chan, struct mtx *mtx, const char *wmesg, - sbintime_t sbt, sbintime_t pr, int flags) __nonnull(1); +int msleep_spin_sbt(void * _Nonnull chan, struct mtx *mtx, + const char *wmesg, sbintime_t sbt, sbintime_t pr, int flags); #define msleep_spin(chan, mtx, wmesg, timo) \ msleep_spin_sbt((chan), (mtx), (wmesg), tick_sbt * (timo), \ 0, C_HARDCLOCK) @@ -402,8 +404,8 @@ int pause_sbt(const char *wmesg, sbintime_t sbt, sbintime_t pr, 0, C_HARDCLOCK) #define tsleep_sbt(chan, pri, wmesg, bt, pr, flags) \ _sleep((chan), NULL, (pri), (wmesg), (bt), (pr), (flags)) -void wakeup(void *chan) __nonnull(1); -void wakeup_one(void *chan) __nonnull(1); +void wakeup(void * chan); +void wakeup_one(void * chan); /* * Common `struct cdev *' stuff are declared here to avoid #include poisoning @@ -451,4 +453,6 @@ extern void (*softdep_ast_cleanup)(void); void counted_warning(unsigned *counter, const char *msg); +__NULLABILITY_PRAGMA_POP + #endif /* !_SYS_SYSTM_H_ */ diff --git a/sys/x86/isa/atpic.c b/sys/x86/isa/atpic.c index 43504e737973..fc1d2dcdd391 100644 --- a/sys/x86/isa/atpic.c +++ b/sys/x86/isa/atpic.c @@ -52,11 +52,7 @@ __FBSDID("$FreeBSD$"); #include <dev/ic/i8259.h> #include <x86/isa/icu.h> -#ifdef PC98 -#include <pc98/cbus/cbus.h> -#else #include <isa/isareg.h> -#endif #include <isa/isavar.h> #ifdef DEV_MCA #include <i386/bios/mca_machdep.h> @@ -282,10 +278,8 @@ atpic_resume(struct pic *pic, bool suspend_cancelled) struct atpic *ap = (struct atpic *)pic; i8259_init(ap, ap == &atpics[SLAVE]); -#ifndef PC98 if (ap == &atpics[SLAVE] && elcr_found) elcr_resume(); -#endif } static int @@ -314,17 +308,6 @@ atpic_config_intr(struct intsrc *isrc, enum intr_trigger trig, if (ai->at_trigger == trig) return (0); -#ifdef PC98 - if ((vector == 0 || vector == 1 || vector == 7 || vector == 8) && - trig == INTR_TRIGGER_LEVEL) { - if (bootverbose) - printf( - "atpic: Ignoring invalid level/low configuration for IRQ%u\n", - vector); - return (EINVAL); - } - return (ENXIO); -#else /* * Certain IRQs can never be level/lo, so don't try to set them * that way if asked. At least some ELCR registers ignore setting @@ -353,7 +336,6 @@ atpic_config_intr(struct intsrc *isrc, enum intr_trigger trig, ai->at_trigger = trig; spinlock_exit(); return (0); -#endif /* PC98 */ } static int @@ -408,11 +390,10 @@ i8259_init(struct atpic *pic, int slave) /* Reset is finished, default to IRR on read. */ outb(pic->at_ioaddr, OCW3_SEL | OCW3_RR); -#ifndef PC98 /* OCW2_L1 sets priority order to 3-7, 0-2 (com2 first). */ if (!slave) outb(pic->at_ioaddr, OCW2_R | OCW2_SL | OCW2_L1); -#endif + spinlock_exit(); } @@ -446,20 +427,6 @@ atpic_startup(void) else #endif -#ifdef PC98 - for (i = 0, ai = atintrs; i < NUM_ISA_IRQS; i++, ai++) - switch (i) { - case 0: - case 1: - case 7: - case 8: - ai->at_trigger = INTR_TRIGGER_EDGE; - break; - default: - ai->at_trigger = INTR_TRIGGER_LEVEL; - break; - } -#else /* * Look for an ELCR. If we find one, update the trigger modes. * If we don't find one, assume that IRQs 0, 1, 2, and 13 are @@ -489,7 +456,6 @@ atpic_startup(void) break; } } -#endif /* PC98 */ } static void @@ -624,9 +590,7 @@ static driver_t atpic_driver = { static devclass_t atpic_devclass; DRIVER_MODULE(atpic, isa, atpic_driver, atpic_devclass, 0, 0); -#ifndef PC98 DRIVER_MODULE(atpic, acpi, atpic_driver, atpic_devclass, 0, 0); -#endif /* * Return a bitmap of the current interrupt requests. This is 8259-specific diff --git a/sys/x86/isa/clock.c b/sys/x86/isa/clock.c index fa4ca5bc6f5c..778481fb73c9 100644 --- a/sys/x86/isa/clock.c +++ b/sys/x86/isa/clock.c @@ -67,17 +67,9 @@ __FBSDID("$FreeBSD$"); #include <machine/timerreg.h> #include <x86/init.h> -#ifdef PC98 -#include <pc98/pc98/pc98_machdep.h> -#else #include <isa/rtc.h> -#endif #ifdef DEV_ISA -#ifdef PC98 -#include <pc98/cbus/cbus.h> -#else #include <isa/isareg.h> -#endif #include <isa/isavar.h> #endif @@ -87,12 +79,8 @@ __FBSDID("$FreeBSD$"); int clkintr_pending; #ifndef TIMER_FREQ -#ifdef PC98 -#define TIMER_FREQ 2457600 -#else #define TIMER_FREQ 1193182 #endif -#endif u_int i8254_freq = TIMER_FREQ; TUNABLE_INT("hw.i8254.freq", &i8254_freq); int i8254_max_count; @@ -110,10 +98,6 @@ struct attimer_softc { int port_rid, intr_rid; struct resource *port_res; struct resource *intr_res; -#ifdef PC98 - int port_rid2; - struct resource *port_res2; -#endif void *intr_handler; struct timecounter tc; struct eventtimer et; @@ -182,11 +166,7 @@ timer_spkr_acquire(void) { int mode; -#ifdef PC98 - mode = TIMER_SEL1 | TIMER_SQWAVE | TIMER_16BIT; -#else mode = TIMER_SEL2 | TIMER_SQWAVE | TIMER_16BIT; -#endif if (timer2_state != RELEASED) return (-1); @@ -199,11 +179,8 @@ timer_spkr_acquire(void) * and this is probably good enough for timer2, so we aren't as * careful with it as with timer0. */ -#ifdef PC98 - outb(TIMER_MODE, TIMER_SEL1 | (mode & 0x3f)); -#else outb(TIMER_MODE, TIMER_SEL2 | (mode & 0x3f)); -#endif + ppi_spkr_on(); /* enable counter2 output to speaker */ return (0); } @@ -215,11 +192,8 @@ timer_spkr_release(void) if (timer2_state != ACQUIRED) return (-1); timer2_state = RELEASED; -#ifdef PC98 - outb(TIMER_MODE, TIMER_SEL1 | TIMER_SQWAVE | TIMER_16BIT); -#else outb(TIMER_MODE, TIMER_SEL2 | TIMER_SQWAVE | TIMER_16BIT); -#endif + ppi_spkr_off(); /* disable counter2 output to speaker */ return (0); } @@ -230,13 +204,8 @@ timer_spkr_setfreq(int freq) freq = i8254_freq / freq; mtx_lock_spin(&clock_lock); -#ifdef PC98 - outb(TIMER_CNTR1, freq & 0xff); - outb(TIMER_CNTR1, freq >> 8); -#else outb(TIMER_CNTR2, freq & 0xff); outb(TIMER_CNTR2, freq >> 8); -#endif mtx_unlock_spin(&clock_lock); } @@ -326,11 +295,7 @@ i8254_delay(int n) while (ticks_left > 0) { #ifdef KDB if (kdb_active) { -#ifdef PC98 - outb(0x5f, 0); -#else inb(0x84); -#endif tick = prev_tick - 1; if (tick <= 0) tick = i8254_max_count; @@ -447,9 +412,7 @@ timer_restore(void) { i8254_restore(); /* restore i8254_freq and hz */ -#ifndef PC98 atrtc_restore(); /* reenable RTC interrupts */ -#endif } #endif @@ -458,10 +421,6 @@ void i8254_init(void) { -#ifdef PC98 - if (pc98_machine_type & M_8M) - i8254_freq = 1996800L; /* 1.9968 MHz */ -#endif set_i8254_freq(MODE_STOP, 0); } @@ -607,51 +566,6 @@ static struct isa_pnp_id attimer_ids[] = { { 0 } }; -#ifdef PC98 -static void -pc98_alloc_resource(device_t dev) -{ - static bus_addr_t iat1[] = {0, 2, 4, 6}; - static bus_addr_t iat2[] = {0, 4}; - struct attimer_softc *sc; - - sc = device_get_softc(dev); - - sc->port_rid = 0; - bus_set_resource(dev, SYS_RES_IOPORT, sc->port_rid, IO_TIMER1, 1); - sc->port_res = isa_alloc_resourcev(dev, SYS_RES_IOPORT, - &sc->port_rid, iat1, 4, RF_ACTIVE); - if (sc->port_res == NULL) - device_printf(dev, "Warning: Couldn't map I/O.\n"); - else - isa_load_resourcev(sc->port_res, iat1, 4); - - sc->port_rid2 = 4; - bus_set_resource(dev, SYS_RES_IOPORT, sc->port_rid2, TIMER_CNTR1, 1); - sc->port_res2 = isa_alloc_resourcev(dev, SYS_RES_IOPORT, - &sc->port_rid2, iat2, 2, RF_ACTIVE); - if (sc->port_res2 == NULL) - device_printf(dev, "Warning: Couldn't map I/O.\n"); - else - isa_load_resourcev(sc->port_res2, iat2, 2); -} - -static void -pc98_release_resource(device_t dev) -{ - struct attimer_softc *sc; - - sc = device_get_softc(dev); - - if (sc->port_res) - bus_release_resource(dev, SYS_RES_IOPORT, sc->port_rid, - sc->port_res); - if (sc->port_res2) - bus_release_resource(dev, SYS_RES_IOPORT, sc->port_rid2, - sc->port_res2); -} -#endif - static int attimer_probe(device_t dev) { @@ -661,11 +575,6 @@ attimer_probe(device_t dev) /* ENOENT means no PnP-ID, device is hinted. */ if (result == ENOENT) { device_set_desc(dev, "AT timer"); -#ifdef PC98 - /* To print resources correctly. */ - pc98_alloc_resource(dev); - pc98_release_resource(dev); -#endif return (BUS_PROBE_LOW_PRIORITY); } return (result); @@ -680,13 +589,9 @@ attimer_attach(device_t dev) attimer_sc = sc = device_get_softc(dev); bzero(sc, sizeof(struct attimer_softc)); -#ifdef PC98 - pc98_alloc_resource(dev); -#else if (!(sc->port_res = bus_alloc_resource(dev, SYS_RES_IOPORT, &sc->port_rid, IO_TIMER1, IO_TIMER1 + 3, 4, RF_ACTIVE))) device_printf(dev,"Warning: Couldn't map I/O.\n"); -#endif i8254_intsrc = intr_lookup_source(0); if (i8254_intsrc != NULL) i8254_pending = i8254_intsrc->is_pic->pic_source_pending; diff --git a/sys/x86/isa/icu.h b/sys/x86/isa/icu.h index 74b21fd97e23..bdd3732513bc 100644 --- a/sys/x86/isa/icu.h +++ b/sys/x86/isa/icu.h @@ -41,38 +41,19 @@ #ifndef _X86_ISA_ICU_H_ #define _X86_ISA_ICU_H_ -#ifdef PC98 -#define ICU_IMR_OFFSET 2 -#else #define ICU_IMR_OFFSET 1 -#endif /* - * PC-98 machines wire the slave 8259A to pin 7 on the master PIC, and * PC-AT machines wire the slave PIC to pin 2 on the master PIC. */ -#ifdef PC98 -#define ICU_SLAVEID 7 -#else #define ICU_SLAVEID 2 -#endif /* * Determine the base master and slave modes not including auto EOI support. * All machines that FreeBSD supports use 8086 mode. */ -#ifdef PC98 -/* - * PC-98 machines do not support auto EOI on the second PIC. Also, it - * seems that PC-98 machine PICs use buffered mode, and the master PIC - * uses special fully nested mode. - */ -#define BASE_MASTER_MODE (ICW4_SFNM | ICW4_BUF | ICW4_MS | ICW4_8086) -#define BASE_SLAVE_MODE (ICW4_BUF | ICW4_8086) -#else #define BASE_MASTER_MODE ICW4_8086 #define BASE_SLAVE_MODE ICW4_8086 -#endif /* Enable automatic EOI if requested. */ #ifdef AUTO_EOI_1 diff --git a/sys/x86/isa/isa.c b/sys/x86/isa/isa.c index e0f8ef1bdaef..27affa5fca3b 100644 --- a/sys/x86/isa/isa.c +++ b/sys/x86/isa/isa.c @@ -64,9 +64,6 @@ __FBSDID("$FreeBSD$"); #include <sys/module.h> #include <machine/bus.h> #include <sys/rman.h> -#ifdef PC98 -#include <sys/systm.h> -#endif #include <machine/resource.h> @@ -132,108 +129,13 @@ isa_alloc_resource(device_t bus, device_t child, int type, int *rid, start, end, count, flags); } -#ifdef PC98 -/* - * Indirection support. The type of bus_space_handle_t is - * defined in sys/i386/include/bus_pc98.h. - */ -struct resource * -isa_alloc_resourcev(device_t child, int type, int *rid, - bus_addr_t *res, bus_size_t count, u_int flags) -{ - struct isa_device* idev = DEVTOISA(child); - struct resource_list *rl = &idev->id_resources; - - device_t bus = device_get_parent(child); - bus_addr_t start; - bus_space_handle_t bh; - struct resource *re; - struct resource **bsre; - int i, j, k, linear_cnt, ressz, bsrid; - - start = bus_get_resource_start(child, type, *rid); - - linear_cnt = count; - ressz = 1; - for (i = 1; i < count; ++i) { - if (res[i] != res[i - 1] + 1) { - if (i < linear_cnt) - linear_cnt = i; - ++ressz; - } - } - - re = isa_alloc_resource(bus, child, type, rid, - start + res[0], start + res[linear_cnt - 1], - linear_cnt, flags); - if (re == NULL) - return NULL; - - bsre = malloc(sizeof (struct resource *) * ressz, M_DEVBUF, M_NOWAIT); - if (bsre == NULL) { - resource_list_release(rl, bus, child, type, *rid, re); - return NULL; - } - bsre[0] = re; - - for (i = linear_cnt, k = 1; i < count; i = j, k++) { - for (j = i + 1; j < count; j++) { - if (res[j] != res[j - 1] + 1) - break; - } - bsrid = *rid + k; - bsre[k] = isa_alloc_resource(bus, child, type, &bsrid, - start + res[i], start + res[j - 1], j - i, flags); - if (bsre[k] == NULL) { - for (k--; k >= 0; k--) - resource_list_release(rl, bus, child, type, - *rid + k, bsre[k]); - free(bsre, M_DEVBUF); - return NULL; - } - } - - bh = rman_get_bushandle(re); - bh->bsh_res = bsre; - bh->bsh_ressz = ressz; - - return re; -} - -int -isa_load_resourcev(struct resource *re, bus_addr_t *res, bus_size_t count) -{ - - return bus_space_map_load(rman_get_bustag(re), rman_get_bushandle(re), - count, res, 0); -} -#endif /* PC98 */ - int isa_release_resource(device_t bus, device_t child, int type, int rid, struct resource *r) { struct isa_device* idev = DEVTOISA(child); struct resource_list *rl = &idev->id_resources; -#ifdef PC98 - /* - * Indirection support. The type of bus_space_handle_t is - * defined in sys/i386/include/bus_pc98.h. - */ - int i; - bus_space_handle_t bh; - if (type == SYS_RES_MEMORY || type == SYS_RES_IOPORT) { - bh = rman_get_bushandle(r); - if (bh != NULL) { - for (i = 1; i < bh->bsh_ressz; i++) - resource_list_release(rl, bus, child, type, - rid + i, bh->bsh_res[i]); - if (bh->bsh_res != NULL) - free(bh->bsh_res, M_DEVBUF); - } - } -#endif return resource_list_release(rl, bus, child, type, rid, r); } diff --git a/sys/x86/x86/autoconf.c b/sys/x86/x86/autoconf.c index 813fe4c9e286..e4919203bebe 100644 --- a/sys/x86/x86/autoconf.c +++ b/sys/x86/x86/autoconf.c @@ -65,9 +65,6 @@ __FBSDID("$FreeBSD$"); #include <net/ethernet.h> #include <netinet/in.h> -#ifdef PC98 -#include <machine/bootinfo.h> -#endif #include <machine/md_var.h> #ifdef DEV_ISA @@ -123,42 +120,8 @@ configure_final(dummy) cninit_finish(); - if (bootverbose) { -#ifdef PC98 - int i; - - /* - * Print out the BIOS's idea of the disk geometries. - */ - printf("BIOS Geometries:\n"); - for (i = 0; i < N_BIOS_GEOM; i++) { - unsigned long bios_geom; - int max_cylinder, max_head, max_sector; - - bios_geom = bootinfo.bi_bios_geom[i]; - - /* - * XXX the bootstrap punts a 1200K floppy geometry - * when the get-disk-geometry interrupt fails. Skip - * drives that have this geometry. - */ - if (bios_geom == 0x4f020f) - continue; - - printf(" %x:%08lx ", i, bios_geom); - max_cylinder = bios_geom >> 16; - max_head = (bios_geom >> 8) & 0xff; - max_sector = bios_geom & 0xff; - printf( - "0..%d=%d cylinders, 0..%d=%d heads, 1..%d=%d sectors\n", - max_cylinder, max_cylinder + 1, - max_head, max_head + 1, - max_sector, max_sector); - } - printf(" %d accounted for\n", bootinfo.bi_n_bios_used); -#endif - + if (bootverbose) printf("Device configuration finished.\n"); - } + cold = 0; } diff --git a/sys/x86/x86/cpu_machdep.c b/sys/x86/x86/cpu_machdep.c index f28ca6d89831..a5fd04912fba 100644 --- a/sys/x86/x86/cpu_machdep.c +++ b/sys/x86/x86/cpu_machdep.c @@ -243,7 +243,6 @@ static int idle_mwait = 1; /* Use MONITOR/MWAIT for short idle. */ SYSCTL_INT(_machdep, OID_AUTO, idle_mwait, CTLFLAG_RWTUN, &idle_mwait, 0, "Use MONITOR/MWAIT for short idle"); -#ifndef PC98 static void cpu_idle_acpi(sbintime_t sbt) { @@ -262,7 +261,6 @@ cpu_idle_acpi(sbintime_t sbt) acpi_cpu_c1(); *state = STATE_RUNNING; } -#endif /* !PC98 */ static void cpu_idle_hlt(sbintime_t sbt) @@ -369,11 +367,7 @@ cpu_probe_amdc1e(void) } } -#if defined(__i386__) && defined(PC98) -void (*cpu_idle_fn)(sbintime_t) = cpu_idle_hlt; -#else void (*cpu_idle_fn)(sbintime_t) = cpu_idle_acpi; -#endif void cpu_idle(int busy) @@ -450,7 +444,7 @@ struct { { cpu_idle_spin, "spin" }, { cpu_idle_mwait, "mwait" }, { cpu_idle_hlt, "hlt" }, -#if !defined(__i386__) || !defined(PC98) +#if !defined(__i386__) { cpu_idle_acpi, "acpi" }, #endif { NULL, NULL } @@ -469,7 +463,7 @@ idle_sysctl_available(SYSCTL_HANDLER_ARGS) if (strstr(idle_tbl[i].id_name, "mwait") && (cpu_feature2 & CPUID2_MON) == 0) continue; -#if !defined(__i386__) || !defined(PC98) +#if !defined(__i386__) if (strcmp(idle_tbl[i].id_name, "acpi") == 0 && cpu_idle_hook == NULL) continue; @@ -508,7 +502,7 @@ idle_sysctl(SYSCTL_HANDLER_ARGS) if (strstr(idle_tbl[i].id_name, "mwait") && (cpu_feature2 & CPUID2_MON) == 0) continue; -#if !defined(__i386__) || !defined(PC98) +#if !defined(__i386__) if (strcmp(idle_tbl[i].id_name, "acpi") == 0 && cpu_idle_hook == NULL) continue; diff --git a/sys/x86/x86/intr_machdep.c b/sys/x86/x86/intr_machdep.c index 1bc7820d5c3e..217fc29aa492 100644 --- a/sys/x86/x86/intr_machdep.c +++ b/sys/x86/x86/intr_machdep.c @@ -61,12 +61,8 @@ #include <machine/frame.h> #include <dev/ic/i8259.h> #include <x86/isa/icu.h> -#ifdef PC98 -#include <pc98/cbus/cbus.h> -#else #include <isa/isareg.h> #endif -#endif #define MAX_STRAY_LOG 5 diff --git a/sys/x86/x86/mptable.c b/sys/x86/x86/mptable.c index c20d2a2066d8..d139b71155d7 100644 --- a/sys/x86/x86/mptable.c +++ b/sys/x86/x86/mptable.c @@ -66,13 +66,8 @@ __FBSDID("$FreeBSD$"); #define MAX_LAPIC_ID 31 /* Max local APIC ID for HTT fixup */ #endif -#ifdef PC98 -#define BIOS_BASE (0xe8000) -#define BIOS_SIZE (0x18000) -#else #define BIOS_BASE (0xf0000) #define BIOS_SIZE (0x10000) -#endif #define BIOS_COUNT (BIOS_SIZE/4) typedef void mptable_entry_handler(u_char *entry, void *arg); @@ -635,20 +630,18 @@ conforming_trigger(u_char src_bus, u_char src_bus_irq) KASSERT(src_bus <= mptable_maxbusid, ("bus id %d too large", src_bus)); switch (busses[src_bus].bus_type) { case ISA: -#ifndef PC98 if (elcr_found) return (elcr_read_trigger(src_bus_irq)); else -#endif return (INTR_TRIGGER_EDGE); case PCI: return (INTR_TRIGGER_LEVEL); -#ifndef PC98 + case EISA: KASSERT(src_bus_irq < 16, ("Invalid EISA IRQ %d", src_bus_irq)); KASSERT(elcr_found, ("Missing ELCR")); return (elcr_read_trigger(src_bus_irq)); -#endif + default: panic("%s: unknown bus type %d", __func__, busses[src_bus].bus_type); diff --git a/sys/x86/x86/nexus.c b/sys/x86/x86/nexus.c index 0ed4d21148a2..f115fdd93824 100644 --- a/sys/x86/x86/nexus.c +++ b/sys/x86/x86/nexus.c @@ -75,12 +75,8 @@ __FBSDID("$FreeBSD$"); #ifdef DEV_ISA #include <isa/isavar.h> -#ifdef PC98 -#include <pc98/cbus/cbus.h> -#else #include <isa/isareg.h> #endif -#endif #include <sys/rtprio.h> #define ELF_KERN_STR ("elf"__XSTRING(__ELF_WORD_SIZE)" kernel") @@ -245,11 +241,7 @@ nexus_init_resources(void) * multiple bridges. (eg: laptops with docking stations) */ drq_rman.rm_start = 0; -#ifdef PC98 - drq_rman.rm_end = 3; -#else drq_rman.rm_end = 7; -#endif drq_rman.rm_type = RMAN_ARRAY; drq_rman.rm_descr = "DMA request lines"; /* XXX drq 0 not available on some machines */ @@ -485,9 +477,6 @@ nexus_map_resource(device_t bus, device_t child, int type, struct resource *r, { struct resource_map_request args; rman_res_t end, length, start; -#ifdef PC98 - int error; -#endif /* Resources must be active to be mapped. */ if (!(rman_get_flags(r) & RF_ACTIVE)) @@ -521,39 +510,20 @@ nexus_map_resource(device_t bus, device_t child, int type, struct resource *r, */ switch (type) { case SYS_RES_IOPORT: -#ifdef PC98 - error = i386_bus_space_handle_alloc(X86_BUS_SPACE_IO, - start, length, &map->r_bushandle); - if (error) - return (error); -#else map->r_bushandle = start; -#endif map->r_bustag = X86_BUS_SPACE_IO; map->r_size = length; map->r_vaddr = NULL; break; case SYS_RES_MEMORY: -#ifdef PC98 - error = i386_bus_space_handle_alloc(X86_BUS_SPACE_MEM, - start, length, &map->r_bushandle); - if (error) - return (error); -#endif map->r_vaddr = pmap_mapdev_attr(start, length, args.memattr); map->r_bustag = X86_BUS_SPACE_MEM; map->r_size = length; /* - * PC-98 stores the virtual address as a member of the - * structure in the handle. On plain x86, the handle is - * the virtual address. + * The handle is the virtual address. */ -#ifdef PC98 - map->r_bushandle->bsh_base = (bus_addr_t)map->r_vaddr; -#else map->r_bushandle = (bus_space_handle_t)map->r_vaddr; -#endif break; } return (0); @@ -572,10 +542,6 @@ nexus_unmap_resource(device_t bus, device_t child, int type, struct resource *r, pmap_unmapdev((vm_offset_t)map->r_vaddr, map->r_size); /* FALLTHROUGH */ case SYS_RES_IOPORT: -#ifdef PC98 - i386_bus_space_handle_free(map->r_bustag, map->r_bushandle, - map->r_bushandle->bsh_sz); -#endif break; default: return (EINVAL); |