Centralise the PDC procedure calls into one file and use a minimal set of

kernel data for PDC results.

Remove the filler components from the PDC structures as a result.

Other tidyups while here.
This commit is contained in:
skrll 2011-01-04 10:42:33 +00:00
parent 9844967b1c
commit 2e4617519c
14 changed files with 657 additions and 205 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: apic.c,v 1.8 2010/12/05 12:19:09 skrll Exp $ */
/* $NetBSD: apic.c,v 1.9 2011/01/04 10:42:33 skrll Exp $ */
/* $OpenBSD: apic.c,v 1.7 2007/10/06 23:50:54 krw Exp $ */
@ -256,35 +256,24 @@ apic_intr(void *v)
return (claimed);
}
/* Maximum number of supported interrupt routing entries. */
#define MAX_INT_TBL_SZ 16
void
apic_get_int_tbl(struct elroy_softc *sc)
{
static struct pdc_pat_io_num int_tbl_sz PDC_ALIGNMENT;
static struct pdc_pat_pci_rt int_tbl[MAX_INT_TBL_SZ] PDC_ALIGNMENT;
int nentries;
size_t size;
int err;
if (pdc_call((iodcio_t)pdc, 0, PDC_PCI_INDEX, PDC_PCI_GET_INT_TBL_SZ,
&int_tbl_sz, 0, 0, 0, 0, 0))
err = pdcproc_pci_inttblsz(&nentries);
if (err)
return;
if (int_tbl_sz.num > MAX_INT_TBL_SZ)
panic("interrupt routing table too big (%d entries)",
int_tbl_sz.num);
size = int_tbl_sz.num * sizeof(struct pdc_pat_pci_rt);
sc->sc_int_tbl_sz = int_tbl_sz.num;
size = nentries * sizeof(struct pdc_pat_pci_rt);
sc->sc_int_tbl_sz = nentries;
sc->sc_int_tbl = malloc(size, M_DEVBUF, M_NOWAIT);
if (sc->sc_int_tbl == NULL)
return;
if (pdc_call((iodcio_t)pdc, 0, PDC_PCI_INDEX, PDC_PCI_GET_INT_TBL,
&int_tbl_sz, 0, &int_tbl, 0, 0, 0))
return;
memcpy(sc->sc_int_tbl, int_tbl, size);
pdcproc_pci_gettable(nentries, size, sc->sc_int_tbl);
}
uint32_t

View File

@ -1,4 +1,4 @@
/* $NetBSD: astro.c,v 1.11 2010/12/11 19:32:05 skrll Exp $ */
/* $NetBSD: astro.c,v 1.12 2011/01/04 10:42:33 skrll Exp $ */
/* $OpenBSD: astro.c,v 1.8 2007/10/06 23:50:54 krw Exp $ */
@ -315,7 +315,7 @@ astro_attach(device_t parent, device_t self, void *aux)
*/
pagezero_cookie = hp700_pagezero_map();
if (PAGE0->mem_cons.pz_class != PCL_DUPLEX)
pdc_call((iodcio_t)pdc, 0, PDC_IO, PDC_IO_RESET_DEVICES);
pdcproc_ioreset();
hp700_pagezero_unmap(pagezero_cookie);
/* Enable iova space. */

View File

@ -1,4 +1,4 @@
/* $NetBSD: lasi.c,v 1.17 2010/12/11 19:32:05 skrll Exp $ */
/* $NetBSD: lasi.c,v 1.18 2011/01/04 10:42:33 skrll Exp $ */
/* $OpenBSD: lasi.c,v 1.4 2001/06/09 03:57:19 mickey Exp $ */
@ -29,7 +29,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: lasi.c,v 1.17 2010/12/11 19:32:05 skrll Exp $");
__KERNEL_RCSID(0, "$NetBSD: lasi.c,v 1.18 2011/01/04 10:42:33 skrll Exp $");
#undef LASIDEBUG
@ -96,7 +96,6 @@ lasi_fix_args(void *_sc, struct gsc_attach_args *ga)
{
struct lasi_softc *sc = _sc;
hppa_hpa_t module_offset;
struct pdc_lan_station_id pdc_mac PDC_ALIGNMENT;
/*
* Determine this module's interrupt bit.
@ -119,10 +118,8 @@ lasi_fix_args(void *_sc, struct gsc_attach_args *ga)
* If this is the Ethernet adapter, get its Ethernet address.
*/
if (module_offset == 0x7000) {
if (pdc_call((iodcio_t)pdc, 0, PDC_LAN_STATION_ID,
PDC_LAN_STATION_ID_READ, &pdc_mac, ga->ga_hpa) == 0)
memcpy(ga->ga_ether_address, pdc_mac.addr,
sizeof(ga->ga_ether_address));
pdcproc_lan_station_id(ga->ga_ether_address,
sizeof(ga->ga_ether_address), ga->ga_hpa);
}
}

View File

@ -1,4 +1,4 @@
/* $NetBSD: lcd.c,v 1.3 2010/12/24 15:29:08 skrll Exp $ */
/* $NetBSD: lcd.c,v 1.4 2011/01/04 10:42:33 skrll Exp $ */
/* OpenBSD: lcd.c,v 1.2 2007/07/20 22:13:45 kettenis Exp */
/*
@ -72,7 +72,7 @@ lcd_attach(device_t parent, device_t self, void *aux)
{
struct lcd_softc *sc = device_private(self);
struct confargs *ca = aux;
struct pdc_chassis_lcd *pdc_lcd = (void *)ca->ca_pdc_iodc_read;
struct pdc_chassis_lcd *pdc_lcd = &ca->ca_pcl;
int i;
sc->sc_dv = self;

View File

@ -1,4 +1,4 @@
/* $NetBSD: mem.c,v 1.26 2010/12/12 08:23:14 skrll Exp $ */
/* $NetBSD: mem.c,v 1.27 2011/01/04 10:42:33 skrll Exp $ */
/* $OpenBSD: mem.c,v 1.30 2007/09/22 16:21:32 krw Exp $ */
/*
@ -73,7 +73,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: mem.c,v 1.26 2010/12/12 08:23:14 skrll Exp $");
__KERNEL_RCSID(0, "$NetBSD: mem.c,v 1.27 2011/01/04 10:42:33 skrll Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@ -182,7 +182,7 @@ memmatch(device_t parent, cfdata_t cf, void *aux)
void
memattach(device_t parent, device_t self, void *aux)
{
struct pdc_iodc_minit pdc_minit PDC_ALIGNMENT;
struct pdc_iodc_minit pdc_minit;
struct confargs *ca = aux;
struct mem_softc *sc = device_private(self);
int err, pagezero_cookie;
@ -255,8 +255,8 @@ memattach(device_t parent, device_t self, void *aux)
} else
sc->sc_vp = NULL;
if ((err = pdc_call((iodcio_t)pdc, 0, PDC_IODC, PDC_IODC_NINIT,
&pdc_minit, ca->ca_hpa, PAGE0->imm_spa_size)) < 0)
err = pdcproc_iodc_ninit(&pdc_minit, ca->ca_hpa, PAGE0->imm_spa_size);
if (err < 0)
pdc_minit.max_spa = PAGE0->imm_max_mem;
hp700_pagezero_unmap(pagezero_cookie);

View File

@ -1,4 +1,4 @@
/* $NetBSD: pdc.c,v 1.36 2010/02/10 20:45:35 skrll Exp $ */
/* $NetBSD: pdc.c,v 1.37 2011/01/04 10:42:33 skrll Exp $ */
/* $OpenBSD: pdc.c,v 1.14 2001/04/29 21:05:43 mickey Exp $ */
@ -29,7 +29,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: pdc.c,v 1.36 2010/02/10 20:45:35 skrll Exp $");
__KERNEL_RCSID(0, "$NetBSD: pdc.c,v 1.37 2011/01/04 10:42:33 skrll Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@ -57,7 +57,10 @@ struct pdc_softc {
} pdcsoftc_t;
pdcio_t pdc;
int pdcret[32] PDC_ALIGNMENT;
static struct pdc_result pdcret1 PDC_ALIGNMENT;
static struct pdc_result pdcret2 PDC_ALIGNMENT;
char pdc_consbuf[IODC_MINIOSIZ] PDC_ALIGNMENT;
iodcio_t pdc_cniodc, pdc_kbdiodc;
pz_device_t *pz_kbd, *pz_cons;
@ -96,8 +99,6 @@ static struct cnm_state pdc_cnm_state;
static int pdcgettod(todr_chip_handle_t, struct timeval *);
static int pdcsettod(todr_chip_handle_t, struct timeval *);
static struct pdc_tod tod PDC_ALIGNMENT;
void
pdc_init(void)
{
@ -121,9 +122,9 @@ pdc_init(void)
/* XXX should we reset the console/kbd here?
well, /boot did that for us anyway */
if ((err = pdc_call((iodcio_t)pdc, 0, PDC_IODC, PDC_IODC_READ,
pdcret, pz_cons->pz_hpa, IODC_IO, cn_iodc, IODC_MAXSIZE)) < 0 ||
&pdcret1, pz_cons->pz_hpa, IODC_IO, cn_iodc, IODC_MAXSIZE)) < 0 ||
(err = pdc_call((iodcio_t)pdc, 0, PDC_IODC, PDC_IODC_READ,
pdcret, pz_kbd->pz_hpa, IODC_IO, kbd_iodc, IODC_MAXSIZE)) < 0) {
&pdcret1, pz_kbd->pz_hpa, IODC_IO, kbd_iodc, IODC_MAXSIZE)) < 0) {
#ifdef DEBUG
printf("pdc_init: failed reading IODC (%d)\n", err);
#endif
@ -388,8 +389,8 @@ pdccnlookc(dev_t dev, int *cp)
s = splhigh();
pagezero_cookie = hp700_pagezero_map();
err = pdc_call(pdc_kbdiodc, 0, pz_kbd->pz_hpa, IODC_IO_CONSIN,
pz_kbd->pz_spa, pz_kbd->pz_layers, pdcret, 0, pdc_consbuf, 1, 0);
l = pdcret[0];
pz_kbd->pz_spa, pz_kbd->pz_layers, &pdcret1, 0, pdc_consbuf, 1, 0);
l = pdcret1.result[0];
*cp = pdc_consbuf[0];
hp700_pagezero_unmap(pagezero_cookie);
splx(s);
@ -422,7 +423,7 @@ pdccnputc(dev_t dev, int c)
pagezero_cookie = hp700_pagezero_map();
*pdc_consbuf = c;
err = pdc_call(pdc_cniodc, 0, pz_cons->pz_hpa, IODC_IO_CONSOUT,
pz_cons->pz_spa, pz_cons->pz_layers, pdcret, 0, pdc_consbuf, 1, 0);
pz_cons->pz_spa, pz_cons->pz_layers, &pdcret1, 0, pdc_consbuf, 1, 0);
hp700_pagezero_unmap(pagezero_cookie);
splx(s);
@ -449,14 +450,15 @@ pdccnpollc(dev_t dev, int on)
static int
pdcgettod(todr_chip_handle_t tch, struct timeval *tvp)
{
struct pdc_tod *tod = (struct pdc_tod *)&pdcret1;
int error;
error = pdc_call((iodcio_t)pdc, 1, PDC_TOD, PDC_TOD_READ,
&tod, 0, 0, 0, 0, 0);
&pdcret1);
if (error == 0) {
tvp->tv_sec = tod.sec;
tvp->tv_usec = tod.usec;
tvp->tv_sec = tod->sec;
tvp->tv_usec = tod->usec;
}
return error;
}
@ -466,10 +468,447 @@ pdcsettod(todr_chip_handle_t tch, struct timeval *tvp)
{
int error;
tod.sec = tvp->tv_sec;
tod.usec = tvp->tv_usec;
error = pdc_call((iodcio_t)pdc, 1, PDC_TOD, PDC_TOD_WRITE,
tod.sec, tod.usec);
tvp->tv_sec, tvp->tv_usec);
return error;
}
int
pdcproc_chassis_display(unsigned long disp)
{
int err;
err = pdc_call((iodcio_t)pdc, 0, PDC_CHASSIS, PDC_CHASSIS_DISP, disp);
return err;
}
int
pdcproc_chassis_info(struct pdc_chassis_info *pci, struct pdc_chassis_lcd *pcl)
{
int err;
err = pdc_call((iodcio_t)pdc, 0, PDC_CHASSIS, PDC_CHASSIS_INFO,
&pdcret1, &pdcret2);
if (err < 0)
return err;
memcpy(pci, &pdcret1, sizeof(*pci));
memcpy(pcl, &pdcret2, sizeof(*pcl));
return err;
}
int
pdcproc_pim(int type, struct pdc_pim *pp, void **buf, size_t *sz)
{
static char data[896] __attribute__((__aligned__(8)));
int err;
err = pdc_call((iodcio_t)pdc, 0, PDC_PIM, type, &pdcret1, data,
sizeof(data));
if (err < 0)
return err;
memcpy(pp, &pdcret1, sizeof(*pp));
*buf = data;
*sz = sizeof(data);
return err;
}
int
pdcproc_model_info(struct pdc_model *pm)
{
int err;
err = pdc_call((iodcio_t)pdc, 0, PDC_MODEL, PDC_MODEL_INFO, &pdcret1);
if (err < 0)
return err;
memcpy(pm, &pdcret1, sizeof(*pm));
return err;
}
int
pdcproc_model_cpuid(struct pdc_cpuid *pc)
{
int err;
err = pdc_call((iodcio_t)pdc, 0, PDC_MODEL, PDC_MODEL_CPUID, &pdcret1);
if (err < 0)
return err;
memcpy(pc, &pdcret1, sizeof(*pc));
return err;
}
int
pdcproc_cache(struct pdc_cache *pc)
{
int err;
err = pdc_call((iodcio_t)pdc, 0, PDC_CACHE, PDC_CACHE_DFLT, &pdcret1);
if (err < 0)
return err;
memcpy(pc, &pdcret1, sizeof(*pc));
return err;
}
int
pdcproc_cache_spidbits(struct pdc_spidb *pcs)
{
int err;
err = pdc_call((iodcio_t)pdc, 0, PDC_CACHE, PDC_CACHE_GETSPIDB,
&pdcret1);
if (err < 0)
return err;
memcpy(pcs, &pdcret1, sizeof(*pcs));
return err;
}
int
pdcproc_hpa_processor(hppa_hpa_t *hpa)
{
int err;
err = pdc_call((iodcio_t)pdc, 0, PDC_HPA, PDC_HPA_DFLT, &pdcret1);
if (err < 0)
return err;
*hpa = pdcret1.result[0];
return err;
}
int
pdcproc_coproc(struct pdc_coproc *pc)
{
int err;
err = pdc_call((iodcio_t)pdc, 0, PDC_COPROC, PDC_COPROC_DFLT, &pdcret1);
if (err < 0)
return err;
memcpy(pc, &pdcret1, sizeof(*pc));
return err;
}
int
pdcproc_iodc_read(hppa_hpa_t hpa, int command, int *actcnt,
struct pdc_iodc_read *buf1, size_t sz1, struct iodc_data *buf2,
size_t sz2)
{
int err;
err = pdc_call((iodcio_t)pdc, 0, PDC_IODC, PDC_IODC_READ,
&pdcret1, hpa, command, &pdcret2, sizeof(pdcret2));
if (err < 0)
return err;
if (actcnt != NULL) {
struct pdc_iodc_read *pir = (struct pdc_iodc_read *)&pdcret1;
*actcnt = pir->size;
}
memcpy(buf1, &pdcret1, sz1);
memcpy(buf2, &pdcret2, sz2);
return err;
}
int
pdcproc_iodc_ninit(struct pdc_iodc_minit *pimi, hppa_hpa_t hpa, int sz)
{
int err;
err = pdc_call((iodcio_t)pdc, 0, PDC_IODC, PDC_IODC_NINIT, &pdcret1,
hpa, sz);
if (err < 0)
return err;
memcpy(pimi, &pdcret1, sizeof(*pimi));
return err;
}
int
pdcproc_instr(unsigned int *mem)
{
int err;
err = pdc_call((iodcio_t)pdc, 0, PDC_INSTR, PDC_INSTR_DFLT, &pdcret1);
if (err < 0)
return err;
memcpy(mem, &pdcret1, sizeof(*mem));
return err;
}
int
pdcproc_block_tlb(struct pdc_btlb *pb)
{
int err;
err = pdc_call((iodcio_t)pdc, 0, PDC_BLOCK_TLB, PDC_BTLB_DEFAULT,
&pdcret1);
if (err < 0)
return err;
memcpy(pb, &pdcret1, sizeof(*pb));
return err;
}
int
pdcproc_btlb_insert(pa_space_t sp, vaddr_t va, paddr_t pa, vsize_t sz,
u_int prot, int index)
{
int err;
err = pdc_call((iodcio_t)pdc, 0, PDC_BLOCK_TLB, PDC_BTLB_INSERT, sp,
va, pa, sz, prot, index);
return err;
}
int
pdcproc_btlb_purge(pa_space_t sp, vaddr_t va, paddr_t pa, vsize_t sz)
{
int err;
err = pdc_call((iodcio_t)pdc, 0, PDC_BLOCK_TLB, PDC_BTLB_PURGE, sp, va,
pa, sz);
return err;
}
int
pdcproc_btlb_purgeall(void)
{
int err;
err = pdc_call((iodcio_t)pdc, 0, PDC_BLOCK_TLB, PDC_BTLB_PURGE_ALL);
return err;
}
int pdcproc_tlb_info(struct pdc_hwtlb *ph)
{
int err;
err = pdc_call((iodcio_t)pdc, 0, PDC_TLB, PDC_TLB_INFO, &pdcret1);
if (err < 0)
return err;
memcpy(ph, &pdcret1, sizeof(*ph));
return err;
}
int
pdcproc_tlb_config(struct pdc_hwtlb *ph, unsigned long hpt,
unsigned long hptsize, unsigned long type)
{
int err;
err = pdc_call((iodcio_t)pdc, 0, PDC_TLB, PDC_TLB_CONFIG, ph, hpt,
hptsize, type);
return err;
}
int
pdcproc_system_map_find_mod(struct pdc_system_map_find_mod *psm,
struct device_path *dev, int mod)
{
int err;
err = pdc_call((iodcio_t)pdc, 0, PDC_SYSTEM_MAP,
PDC_SYSTEM_MAP_FIND_MOD, &pdcret1, &pdcret2, mod);
if (err < 0)
return err;
memcpy(psm, &pdcret1, sizeof(*psm));
memcpy(dev, &pdcret2, sizeof(*dev));
return err;
}
int
pdcproc_system_map_find_addr(struct pdc_system_map_find_addr *psm, int mod,
int addr)
{
int err;
err = pdc_call((iodcio_t)pdc, 0, PDC_SYSTEM_MAP,
PDC_SYSTEM_MAP_FIND_ADDR, &pdcret1, mod, addr);
if (err < 0)
return err;
memcpy(psm, &pdcret1, sizeof(*psm));
return err;
}
int
pdcproc_system_map_trans_path(struct pdc_memmap *pmm, struct device_path *dev)
{
int err;
memcpy(&pdcret2, dev, sizeof(*dev));
err = pdc_call((iodcio_t)pdc, 0, PDC_SYSTEM_MAP,
PDC_SYSTEM_MAP_TRANS_PATH, &pdcret1, &pdcret2);
if (err < 0)
return err;
memcpy(pmm, &pdcret1, sizeof(*pmm));
return err;
}
int
pdcproc_soft_power_info(struct pdc_power_info *pspi)
{
int err;
err = pdc_call((iodcio_t)pdc, 0, PDC_SOFT_POWER, PDC_SOFT_POWER_INFO,
&pdcret1, 0);
if (err < 0)
return err;
memcpy(pspi, &pdcret1, sizeof(*pspi));
return err;
}
int
pdcproc_soft_power_enable(int action)
{
int err;
err = pdc_call((iodcio_t)pdc, 0, PDC_SOFT_POWER, PDC_SOFT_POWER_ENABLE,
&pdcret1, action);
return err;
}
int
pdcproc_memmap(struct pdc_memmap *pmm, struct device_path *dev)
{
int err;
memcpy(&pdcret2, dev, sizeof(*dev));
err = pdc_call((iodcio_t)pdc, 0, PDC_MEMMAP, PDC_MEMMAP_HPA, &pdcret1,
&pdcret2);
if (err < 0)
return err;
memcpy(pmm, &pdcret1, sizeof(*pmm));
return err;
}
int
pdcproc_ioclrerrors(void)
{
int err;
err = pdc_call((iodcio_t)pdc, 0, PDC_IO, PDC_IO_READ_AND_CLEAR_ERRORS);
return err;
}
int
pdcproc_ioreset(void)
{
int err;
err = pdc_call((iodcio_t)pdc, 0, PDC_IO, PDC_IO_RESET_DEVICES);
return err;
}
int
pdcproc_doreset(void)
{
int err;
err = pdc_call((iodcio_t)pdc, 0, PDC_BROADCAST_RESET, PDC_DO_RESET);
return err;
}
int
pdcproc_lan_station_id(char *addr, size_t sz, hppa_hpa_t hpa)
{
struct pdc_lan_station_id *mac = (struct pdc_lan_station_id *)&pdcret1;
int err;
err = pdc_call((iodcio_t)pdc, 0, PDC_LAN_STATION_ID,
PDC_LAN_STATION_ID_READ, &pdcret1, hpa);
if (err < 0)
return err;
memcpy(addr, mac->addr, sz);
return 0;
}
int
pdcproc_pci_inttblsz(int *nentries)
{
struct pdc_pat_io_num *ppio = (struct pdc_pat_io_num *)&pdcret1;
int err;
err = pdc_call((iodcio_t)pdc, 0, PDC_PCI_INDEX, PDC_PCI_GET_INT_TBL_SZ,
&pdcret1);
*nentries = ppio->num;
return err;
}
/* Maximum number of supported interrupt routing entries. */
#define MAX_INT_TBL_SZ 16
int
pdcproc_pci_gettable(int nentries, size_t size, void *table)
{
int err;
static struct pdc_pat_pci_rt int_tbl[MAX_INT_TBL_SZ] PDC_ALIGNMENT;
if (nentries > MAX_INT_TBL_SZ)
panic("interrupt routing table too big (%d entries)", nentries);
pdcret1.result[0] = nentries;
err = pdc_call((iodcio_t)pdc, 0, PDC_PCI_INDEX, PDC_PCI_GET_INT_TBL,
&pdcret1, 0, &int_tbl);
if (err < 0)
return err;
memcpy(table, int_tbl, size);
return err;
}

View File

@ -1,4 +1,4 @@
/* $NetBSD: power.c,v 1.5 2010/12/12 08:23:14 skrll Exp $ */
/* $NetBSD: power.c,v 1.6 2011/01/04 10:42:33 skrll Exp $ */
/*
* Copyright (c) 2004 Jochen Kunz.
@ -100,7 +100,7 @@ void powerattach(device_t, device_t, void *);
CFATTACH_DECL_NEW(power, sizeof(struct power_softc),
powermatch, powerattach, NULL, NULL);
static struct pdc_power_info pdc_power_info PDC_ALIGNMENT;
static struct pdc_power_info pdc_power_info;
static bool pswitch_on; /* power switch */
static int pwr_sw_control;
static const char *pwr_sw_control_str[] = {"disabled", "enabled", "locked"};
@ -132,14 +132,15 @@ powerattach(device_t parent, device_t self, void *aux)
{
struct power_softc *sc = device_private(self);
struct confargs *ca = aux;
int err;
sc->sc_dev = self;
sc->sc_kicker = NULL;
if (!pdc_call((iodcio_t)pdc, 0, PDC_SOFT_POWER,
PDC_SOFT_POWER_INFO, &pdc_power_info, 0)) {
err = pdcproc_soft_power_info(&pdc_power_info);
if (!err)
ca->ca_hpa = pdc_power_info.addr;
}
switch (cpu_modelno) {
case HPPA_BOARD_HP712_60:
@ -248,9 +249,8 @@ power_cold_hook_reg(int on)
{
int error;
if ((error = pdc_call((iodcio_t)pdc, 0, PDC_SOFT_POWER,
PDC_SOFT_POWER_ENABLE, &pdc_power_info,
on == HPPA_COLD_HOT)))
error = pdcproc_soft_power_enable(on == HPPA_COLD_HOT);
if (error)
aprint_error("PDC_SOFT_POWER_ENABLE failed (%d)\n", error);
}

View File

@ -1,4 +1,4 @@
/* $NetBSD: oosiop_gsc.c,v 1.10 2010/12/11 19:32:06 skrll Exp $ */
/* $NetBSD: oosiop_gsc.c,v 1.11 2011/01/04 10:42:33 skrll Exp $ */
/*
* Copyright (c) 2001 Matt Fredette. All rights reserved.
@ -80,7 +80,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: oosiop_gsc.c,v 1.10 2010/12/11 19:32:06 skrll Exp $");
__KERNEL_RCSID(0, "$NetBSD: oosiop_gsc.c,v 1.11 2011/01/04 10:42:33 skrll Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@ -156,7 +156,7 @@ oosiop_gsc_attach(device_t parent, device_t self, void *aux)
return;
}
sc->sc_freq = ga->ga_ca.ca_pdc_iodc_read->filler2[14];
sc->sc_freq = ga->ga_ca.ca_pir.filler2[14];
if (sc->sc_freq == 0)
sc->sc_freq = 50000000;

View File

@ -1,4 +1,4 @@
/* $NetBSD: osiop_gsc.c,v 1.17 2010/12/11 19:32:06 skrll Exp $ */
/* $NetBSD: osiop_gsc.c,v 1.18 2011/01/04 10:42:33 skrll Exp $ */
/*
* Copyright (c) 2001 Matt Fredette. All rights reserved.
@ -80,7 +80,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: osiop_gsc.c,v 1.17 2010/12/11 19:32:06 skrll Exp $");
__KERNEL_RCSID(0, "$NetBSD: osiop_gsc.c,v 1.18 2011/01/04 10:42:33 skrll Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@ -156,7 +156,7 @@ osiop_gsc_attach(device_t parent, device_t self, void *aux)
return;
}
sc->sc_clock_freq = ga->ga_ca.ca_pdc_iodc_read->filler2[14] / 1000000;
sc->sc_clock_freq = ga->ga_ca.ca_pir.filler2[14] / 1000000;
if (!sc->sc_clock_freq)
sc->sc_clock_freq = 50;

View File

@ -1,4 +1,4 @@
/* $NetBSD: autoconf.c,v 1.34 2010/11/13 07:58:55 skrll Exp $ */
/* $NetBSD: autoconf.c,v 1.35 2011/01/04 10:42:34 skrll Exp $ */
/* $OpenBSD: autoconf.c,v 1.15 2001/06/25 00:43:10 mickey Exp $ */
@ -86,7 +86,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: autoconf.c,v 1.34 2010/11/13 07:58:55 skrll Exp $");
__KERNEL_RCSID(0, "$NetBSD: autoconf.c,v 1.35 2011/01/04 10:42:34 skrll Exp $");
#include "opt_kgdb.h"
#include "opt_useleds.h"
@ -105,6 +105,7 @@ __KERNEL_RCSID(0, "$NetBSD: autoconf.c,v 1.34 2010/11/13 07:58:55 skrll Exp $");
#include <sys/kgdb.h>
#endif
#include <machine/pdc.h>
#include <machine/iomod.h>
#include <machine/autoconf.h>
@ -457,10 +458,9 @@ cpu_rootconf(void)
/*static struct device fakerdrootdev = { DV_DISK, {}, NULL, 0, "rd0", NULL };*/
#endif
static struct pdc_memmap pdc_memmap PDC_ALIGNMENT;
static struct pdc_iodc_read pdc_iodc_read PDC_ALIGNMENT;
static struct pdc_system_map_find_mod pdc_find_mod PDC_ALIGNMENT;
static struct pdc_system_map_find_addr pdc_find_addr PDC_ALIGNMENT;
static struct pdc_memmap pdc_memmap;
static struct pdc_system_map_find_mod pdc_find_mod;
static struct pdc_system_map_find_addr pdc_find_addr;
void
pdc_scanbus(device_t self, struct confargs *ca,
@ -489,18 +489,17 @@ pdc_scanbus(device_t self, struct confargs *ca,
if (ca->ca_hpabase) {
nca.ca_hpa = ca->ca_hpabase + IOMOD_HPASIZE * i;
nca.ca_dp.dp_mod = i;
} else if ((error = pdc_call((iodcio_t)pdc, 0, PDC_MEMMAP,
PDC_MEMMAP_HPA, &pdc_memmap, &nca.ca_dp)) == 0)
} else if ((error = pdcproc_memmap(&pdc_memmap,
&nca.ca_dp)) == 0)
nca.ca_hpa = pdc_memmap.hpa;
else if ((error = pdc_call((iodcio_t)pdc, 0, PDC_SYSTEM_MAP,
PDC_SYSTEM_MAP_TRANS_PATH, &pdc_memmap, &nca.ca_dp)) == 0) {
else if ((error = pdcproc_system_map_trans_path(&pdc_memmap,
&nca.ca_dp)) == 0) {
struct device_path path;
int im, ia;
nca.ca_hpa = pdc_memmap.hpa;
for (im = 0; !(error = pdc_call((iodcio_t)pdc, 0,
PDC_SYSTEM_MAP, PDC_SYSTEM_MAP_FIND_MOD,
for (im = 0; !(error = pdcproc_system_map_find_mod(
&pdc_find_mod, &path, im)) &&
pdc_find_mod.hpa != nca.ca_hpa; im++)
;
@ -510,18 +509,21 @@ pdc_scanbus(device_t self, struct confargs *ca,
if (!error && pdc_find_mod.naddrs) {
nca.ca_naddrs = pdc_find_mod.naddrs;
if (nca.ca_naddrs > 16) {
nca.ca_naddrs = 16;
if (nca.ca_naddrs > HP700_MAXIOADDRS) {
nca.ca_naddrs = HP700_MAXIOADDRS;
aprint_error("WARNING: "
"too many (%d) addrs\n",
pdc_find_mod.naddrs);
}
aprint_verbose(">> ADDRS: ");
for (ia = 0; !(error = pdc_call((iodcio_t)pdc,
0, PDC_SYSTEM_MAP, PDC_SYSTEM_MAP_FIND_ADDR,
&pdc_find_addr, im, ia + 1)) && ia < nca.ca_naddrs; ia++) {
nca.ca_addrs[ia].addr = pdc_find_addr.hpa;
for (ia = 0; ia < nca.ca_naddrs; ia++) {
error = pdcproc_system_map_find_addr(
&pdc_find_addr, im, ia + 1);
if (error)
break;
nca.ca_addrs[ia].addr =
pdc_find_addr.hpa;
nca.ca_addrs[ia].size =
pdc_find_addr.size << PGSHIFT;
@ -539,8 +541,8 @@ pdc_scanbus(device_t self, struct confargs *ca,
aprint_verbose(">> HPA 0x%lx[0x%x]\n", nca.ca_hpa,
nca.ca_hpasz);
if ((error = pdc_call((iodcio_t)pdc, 0, PDC_IODC,
PDC_IODC_READ, &pdc_iodc_read, nca.ca_hpa, IODC_DATA,
if ((error = pdcproc_iodc_read(nca.ca_hpa, IODC_DATA, NULL,
&nca.ca_pir, sizeof(nca.ca_pir),
&nca.ca_type, sizeof(nca.ca_type))) < 0) {
aprint_verbose(">> iodc_data error %d\n", error);
continue;
@ -557,7 +559,6 @@ pdc_scanbus(device_t self, struct confargs *ca,
nca.ca_type.iodc_type, nca.ca_type.iodc_sv_model);
nca.ca_irq = HP700CF_IRQ_UNDEF;
nca.ca_pdc_iodc_read = &pdc_iodc_read;
nca.ca_name = hppa_mod_info(nca.ca_type.iodc_type,
nca.ca_type.iodc_sv_model);

View File

@ -1,4 +1,4 @@
/* $NetBSD: machdep.c,v 1.94 2010/12/12 08:54:25 skrll Exp $ */
/* $NetBSD: machdep.c,v 1.95 2011/01/04 10:42:34 skrll Exp $ */
/*-
* Copyright (c) 2001, 2002 The NetBSD Foundation, Inc.
@ -58,7 +58,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.94 2010/12/12 08:54:25 skrll Exp $");
__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.95 2011/01/04 10:42:34 skrll Exp $");
#include "opt_cputype.h"
#include "opt_ddb.h"
@ -162,9 +162,9 @@ static int pagezero_mapped = 1;
/*
* CPU params (should be the same for all cpus in the system)
*/
struct pdc_cache pdc_cache PDC_ALIGNMENT;
struct pdc_btlb pdc_btlb PDC_ALIGNMENT;
struct pdc_model pdc_model PDC_ALIGNMENT;
struct pdc_cache pdc_cache;
struct pdc_btlb pdc_btlb;
struct pdc_model pdc_model;
int usebtlb;
@ -279,12 +279,12 @@ void blink_lcd_timeout(void *);
/*
* wide used hardware params
*/
struct pdc_hwtlb pdc_hwtlb PDC_ALIGNMENT;
struct pdc_coproc pdc_coproc PDC_ALIGNMENT;
struct pdc_coherence pdc_coherence PDC_ALIGNMENT;
struct pdc_spidb pdc_spidbits PDC_ALIGNMENT;
struct pdc_pim pdc_pim PDC_ALIGNMENT;
struct pdc_model pdc_model PDC_ALIGNMENT;
struct pdc_hwtlb pdc_hwtlb;
struct pdc_coproc pdc_coproc;
struct pdc_coherence pdc_coherence;
struct pdc_spidb pdc_spidbits;
struct pdc_pim pdc_pim;
struct pdc_model pdc_model;
/*
* Debugger info.
@ -447,8 +447,8 @@ hppa_init(paddr_t start, void *bi)
delay_init(); /* calculate CPU clock ratio */
/* cache parameters */
if ((error = pdc_call((iodcio_t)pdc, 0, PDC_CACHE, PDC_CACHE_DFLT,
&pdc_cache)) < 0) {
error = pdcproc_cache(&pdc_cache);
if (error < 0) {
#ifdef DEBUG
printf("WARNING: PDC_CACHE error %d\n", error);
#endif
@ -459,23 +459,14 @@ hppa_init(paddr_t start, void *bi)
icache_line_mask = pdc_cache.ic_conf.cc_line * 16 - 1;
icache_stride = pdc_cache.ic_stride;
/* cache coherence params (pbably available for 8k only) */
error = pdc_call((iodcio_t)pdc, 0, PDC_CACHE, PDC_CACHE_SETCS,
&pdc_coherence, 1, 1, 1, 1);
#ifdef DEBUG
printf ("PDC_CACHE_SETCS: %d, %d, %d, %d (%d)\n",
pdc_coherence.ia_cst, pdc_coherence.da_cst,
pdc_coherence.ita_cst, pdc_coherence.dta_cst, error);
#endif
error = pdc_call((iodcio_t)pdc, 0, PDC_CACHE, PDC_CACHE_GETSPIDB,
&pdc_spidbits, 0, 0, 0, 0);
error = pdcproc_cache_spidbits(&pdc_spidbits);
#ifdef DEBUG
printf("SPID bits: 0x%x, error = %d\n", pdc_spidbits.spidbits, error);
#endif
/* Calculate the OS_HPMC handler checksums. */
p = &os_hpmc;
if (pdc_call((iodcio_t)pdc, 0, PDC_INSTR, PDC_INSTR_DFLT, p))
if (pdcproc_instr(p))
*p = 0x08000240;
p[7] = ((char *) &os_hpmc_cont_end) - ((char *) &os_hpmc_cont);
p[6] = (u_int) &os_hpmc_cont;
@ -564,8 +555,7 @@ do { \
printf("%s: PDC_CHASSIS\n", __func__);
#endif
/* they say PDC_COPROC might turn fault light on */
pdc_call((iodcio_t)pdc, 0, PDC_CHASSIS, PDC_CHASSIS_DISP,
PDC_OSTAT(PDC_OSTAT_RUN) | 0xCEC0);
pdcproc_chassis_display(PDC_OSTAT(PDC_OSTAT_RUN) | 0xCEC0);
#ifdef DEBUG
printf("%s: intr bootstrap\n", __func__);
@ -637,7 +627,7 @@ cpuid(void)
extern u_int trap_ep_T_ITLBMISS[];
extern u_int trap_ep_T_ITLBMISSNA[];
struct pdc_cpuid pdc_cpuid PDC_ALIGNMENT;
struct pdc_cpuid pdc_cpuid;
const struct hppa_cpu_info *p = NULL;
const char *model;
u_int cpu_version, cpu_features;
@ -650,8 +640,8 @@ cpuid(void)
cpu_version = 0;
/* identify system type */
if ((error = pdc_call((iodcio_t)pdc, 0, PDC_MODEL, PDC_MODEL_INFO,
&pdc_model)) < 0) {
error = pdcproc_model_info(&pdc_model);
if (error < 0) {
#ifdef DEBUG
printf("WARNING: PDC_MODEL_INFO error %d\n", error);
#endif
@ -670,8 +660,8 @@ cpuid(void)
#endif
memset(&pdc_cpuid, 0, sizeof(pdc_cpuid));
if ((error = pdc_call((iodcio_t)pdc, 0, PDC_MODEL, PDC_MODEL_CPUID,
&pdc_cpuid, 0, 0, 0, 0)) < 0) {
error = pdcproc_model_cpuid(&pdc_cpuid);
if (error < 0) {
#ifdef DEBUG
printf("WARNING: PDC_MODEL_CPUID error %d. "
"Using cpu_modelno based cpu_type.\n", error);
@ -695,8 +685,8 @@ cpuid(void)
/* locate coprocessors and SFUs */
memset(&pdc_coproc, 0, sizeof(pdc_coproc));
if ((error = pdc_call((iodcio_t)pdc, 0, PDC_COPROC, PDC_COPROC_DFLT,
&pdc_coproc, 0, 0, 0, 0)) < 0) { /* XXXNH 0,0,0,0 ???*/
error = pdcproc_coproc(&pdc_coproc);
if (error < 0) {
printf("WARNING: PDC_COPROC error %d\n", error);
pdc_coproc.ccr_enable = 0;
} else {
@ -723,8 +713,8 @@ cpuid(void)
} else {
/* BTLB params */
if ((error = pdc_call((iodcio_t)pdc, 0, PDC_BLOCK_TLB,
PDC_BTLB_DEFAULT, &pdc_btlb)) < 0) {
error = pdcproc_block_tlb(&pdc_btlb);
if (error < 0) {
#ifdef DEBUG
printf("WARNING: PDC_BTLB error %d\n", error);
#endif
@ -744,8 +734,7 @@ cpuid(void)
pdc_btlb.vinfo.num_c);
#endif /* BTLBDEBUG */
/* purge TLBs and caches */
if (pdc_call((iodcio_t)pdc, 0, PDC_BLOCK_TLB,
PDC_BTLB_PURGE_ALL) < 0)
if (pdcproc_btlb_purgeall() < 0)
printf("WARNING: BTLB purge failed\n");
hppa_btlb_size_min = pdc_btlb.min_size;
@ -762,7 +751,7 @@ cpuid(void)
}
usebtlb = 0;
error = pdc_call((iodcio_t)pdc, 0, PDC_TLB, PDC_TLB_INFO, &pdc_hwtlb);
error = pdcproc_tlb_info(&pdc_hwtlb);
if (error == 0 && pdc_hwtlb.min_size != 0 && pdc_hwtlb.max_size != 0) {
cpu_features |= HPPA_FTRS_HVT;
if (pmap_hptsize > pdc_hwtlb.max_size)
@ -1050,8 +1039,7 @@ int
hpti_g(vaddr_t hpt, vsize_t hptsize)
{
return pdc_call((iodcio_t)pdc, 0, PDC_TLB, PDC_TLB_CONFIG,
&pdc_hwtlb, hpt, hptsize, PDC_TLB_CURRPDE);
return pdcproc_tlb_config(&pdc_hwtlb, hpt, hptsize, PDC_TLB_CURRPDE);
}
int
@ -1065,8 +1053,8 @@ ibtlb_g(int i, pa_space_t sp, vaddr_t va, paddr_t pa, vsize_t sz, u_int prot)
{
int error;
if ((error = pdc_call((iodcio_t)pdc, 0, PDC_BLOCK_TLB, PDC_BTLB_INSERT,
sp, va, pa, sz, prot, i)) < 0) {
error = pdcproc_btlb_insert(sp, va, pa, sz, prot, i);
if (error < 0) {
#ifdef BTLBDEBUG
printf("WARNING: BTLB insert failed (%d)\n", error);
#endif
@ -1118,13 +1106,14 @@ _hp700_btlb_insert(struct btlb_slot *btlb_slot)
#endif
/* Insert this mapping. */
if ((error = pdc_call((iodcio_t)pdc, 0, PDC_BLOCK_TLB, PDC_BTLB_INSERT,
error = pdcproc_btlb_insert(
btlb_slot->btlb_slot_va_space,
btlb_slot->btlb_slot_va_frame,
btlb_slot->btlb_slot_pa_frame,
btlb_slot->btlb_slot_frames,
btlb_slot->btlb_slot_tlbprot,
btlb_slot->btlb_slot_number)) < 0) {
btlb_slot->btlb_slot_number);
if (error < 0) {
#ifdef BTLBDEBUG
printf("WARNING: BTLB insert failed (%d)\n", error);
#endif
@ -1330,12 +1319,12 @@ hppa_btlb_purge(pa_space_t space, vaddr_t va, vsize_t *sizep)
if (btlb_slot->btlb_slot_frames != 0 &&
btlb_slot->btlb_slot_va_space == space &&
btlb_slot->btlb_slot_va_frame == va) {
if ((error = pdc_call((iodcio_t)pdc, 0,
PDC_BLOCK_TLB, PDC_BTLB_PURGE,
error = pdcproc_btlb_purge(
btlb_slot->btlb_slot_va_space,
btlb_slot->btlb_slot_va_frame,
btlb_slot->btlb_slot_number,
btlb_slot->btlb_slot_frames)) < 0) {
btlb_slot->btlb_slot_frames);
if (error < 0) {
#ifdef BTLBDEBUG
printf("WARNING: BTLB purge failed (%d)\n",
error);
@ -1446,7 +1435,7 @@ cpu_reboot(int howto, char *user_boot_string)
:: "r" (CMD_RESET), "r" (LBCAST_ADDR + iomod_command));
/* ask firmware to reset */
pdc_call((iodcio_t)pdc, 0, PDC_BROADCAST_RESET, PDC_DO_RESET);
pdcproc_doreset();
/* forcably reset module if that fails */
__asm __volatile("stwas %0, 0(%1)"
:: "r" (CMD_RESET), "r" (HPPA_LBCAST + iomod_command));
@ -1481,7 +1470,6 @@ cpu_dumpsize(void)
* an LPMC, or a TOC. The check type is passed in as a trap
* type, one of T_HPMC, T_LPMC, or T_INTERRUPT (for TOC).
*/
static char pim_data_buffer[896] __attribute__((__aligned__(8)));
static char in_check = 0;
#define PIM_WORD(name, word, bits) \
@ -1493,7 +1481,7 @@ do { \
static inline void
hppa_pim_dump(int check_type)
hppa_pim_dump(int check_type, void *data, size_t size)
{
struct hp700_pim_hpmc *hpmc;
struct hp700_pim_lpmc *lpmc;
@ -1509,16 +1497,16 @@ hppa_pim_dump(int check_type)
checks = NULL;
switch (check_type) {
case T_HPMC:
hpmc = (struct hp700_pim_hpmc *) pim_data_buffer;
hpmc = (struct hp700_pim_hpmc *) data;
regs = &hpmc->pim_hpmc_regs;
checks = &hpmc->pim_hpmc_checks;
break;
case T_LPMC:
lpmc = (struct hp700_pim_lpmc *) pim_data_buffer;
lpmc = (struct hp700_pim_lpmc *) data;
checks = &lpmc->pim_lpmc_checks;
break;
case T_INTERRUPT:
toc = (struct hp700_pim_toc *) pim_data_buffer;
toc = (struct hp700_pim_toc *) data;
regs = &toc->pim_toc_regs;
break;
default:
@ -1585,7 +1573,7 @@ hppa_pim_dump(int check_type)
}
static inline void
hppa_pim64_dump(int check_type)
hppa_pim64_dump(int check_type, void *data, size_t size)
{
struct hp700_pim64_hpmc *hpmc;
struct hp700_pim64_lpmc *lpmc;
@ -1601,16 +1589,16 @@ hppa_pim64_dump(int check_type)
checks = NULL;
switch (check_type) {
case T_HPMC:
hpmc = (struct hp700_pim64_hpmc *) pim_data_buffer;
hpmc = (struct hp700_pim64_hpmc *) data;
regs = &hpmc->pim_hpmc_regs;
checks = &hpmc->pim_hpmc_checks;
break;
case T_LPMC:
lpmc = (struct hp700_pim64_lpmc *) pim_data_buffer;
lpmc = (struct hp700_pim64_lpmc *) data;
checks = &lpmc->pim_lpmc_checks;
break;
case T_INTERRUPT:
toc = (struct hp700_pim64_toc *) pim_data_buffer;
toc = (struct hp700_pim64_toc *) data;
regs = &toc->pim_toc_regs;
break;
default:
@ -1686,6 +1674,8 @@ hppa_machine_check(int check_type)
int pdc_pim_type;
const char *name;
int pimerror, error;
void *data;
size_t size;
/* Do an fcacheall(). */
fcacheall();
@ -1709,10 +1699,9 @@ hppa_machine_check(int check_type)
/* NOTREACHED */
}
pimerror = pdc_call((iodcio_t)pdc, 0, PDC_PIM, pdc_pim_type,
&pdc_pim, pim_data_buffer, sizeof(pim_data_buffer));
pimerror = pdcproc_pim(pdc_pim_type, &pdc_pim, &data, &size);
KASSERT(pdc_pim.count <= sizeof(pim_data_buffer));
KASSERT(pdc_pim.count <= size);
/*
* Reset IO and log errors.
@ -1721,7 +1710,7 @@ hppa_machine_check(int check_type)
* if we take a HPMC interrupt. This PDC procedure may not be
* implemented by some machines.
*/
error = pdc_call((iodcio_t)pdc, 0, PDC_IO, 0, 0, 0, 0);
error = pdcproc_ioclrerrors();
if (error != PDC_ERR_OK && error != PDC_ERR_NOPROC)
/* This seems futile if we can't print to the console. */
panic("PDC_IO failed");
@ -1732,9 +1721,9 @@ hppa_machine_check(int check_type)
printf(" - WARNING: could not transfer PIM info (%d)", pimerror);
} else {
if (hppa_cpu_ispa20_p())
hppa_pim64_dump(check_type);
hppa_pim64_dump(check_type, data, size);
else
hppa_pim_dump(check_type);
hppa_pim_dump(check_type, data, size);
}
printf("\n");

View File

@ -1,4 +1,4 @@
/* $NetBSD: mainbus.c,v 1.74 2010/12/12 08:23:14 skrll Exp $ */
/* $NetBSD: mainbus.c,v 1.75 2011/01/04 10:42:34 skrll Exp $ */
/*-
* Copyright (c) 2001, 2002 The NetBSD Foundation, Inc.
@ -58,7 +58,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: mainbus.c,v 1.74 2010/12/12 08:23:14 skrll Exp $");
__KERNEL_RCSID(0, "$NetBSD: mainbus.c,v 1.75 2011/01/04 10:42:34 skrll Exp $");
#include "locators.h"
#include "power.h"
@ -83,10 +83,8 @@ __KERNEL_RCSID(0, "$NetBSD: mainbus.c,v 1.74 2010/12/12 08:23:14 skrll Exp $");
#include <hp700/hp700/intr.h>
#include <hp700/dev/cpudevs.h>
static struct pdc_hpa pdc_hpa PDC_ALIGNMENT;
#if NLCD > 0
static struct pdc_chassis_info pdc_chassis_info PDC_ALIGNMENT;
static struct pdc_chassis_lcd pdc_chassis_lcd PDC_ALIGNMENT;
static struct pdc_chassis_info pdc_chassis_info;
#endif
#ifdef MBUSDEBUG
@ -1360,13 +1358,16 @@ mbattach(device_t parent, device_t self, void *aux)
struct confargs nca;
bus_space_handle_t ioh;
hppa_hpa_t hpabase;
hppa_hpa_t prochpa;
int err;
sc->sc_dv = self;
mb_attached = 1;
/* fetch the "default" cpu hpa */
if (pdc_call((iodcio_t)pdc, 0, PDC_HPA, PDC_HPA_DFLT, &pdc_hpa) < 0)
err = pdcproc_hpa_processor(&prochpa);
if (err < 0)
panic("mbattach: PDC_HPA failed");
/*
@ -1375,20 +1376,23 @@ mbattach(device_t parent, device_t self, void *aux)
* end of the address space.
*/
/*
* XXX fredette - this may be a copout, or it may
* be a great idea. I'm not sure which yet.
* XXX fredette - this may be a copout, or it may be a great idea. I'm
* not sure which yet.
*/
if (bus_space_map(&hppa_bustag, pdc_hpa.hpa, 0 - pdc_hpa.hpa, 0, &ioh))
panic("mbattach: can't map mainbus IO space");
/* map all the way till the end of the memory */
if (bus_space_map(&hppa_bustag, prochpa, (~0LU - prochpa + 1),
0, &ioh))
panic("%s: cannot map mainbus IO space", __func__);
/*
* Local-Broadcast the HPA to all modules on the bus
*/
((struct iomod *)(pdc_hpa.hpa & HPPA_FLEX_MASK))[FPA_IOMOD].io_flex =
(void *)((pdc_hpa.hpa & HPPA_FLEX_MASK) | DMA_ENABLE);
((struct iomod *)(prochpa & HPPA_FLEX_MASK))[FPA_IOMOD].io_flex =
(void *)((prochpa & HPPA_FLEX_MASK) | DMA_ENABLE);
sc->sc_hpa = pdc_hpa.hpa;
aprint_normal(" [flex %lx]\n", pdc_hpa.hpa & HPPA_FLEX_MASK);
sc->sc_hpa = prochpa;
aprint_normal(" [flex %lx]\n", prochpa & HPPA_FLEX_MASK);
/* PDC first */
memset(&nca, 0, sizeof(nca));
@ -1408,18 +1412,16 @@ mbattach(device_t parent, device_t self, void *aux)
#endif
#if NLCD > 0
if (!pdc_call((iodcio_t)pdc, 0, PDC_CHASSIS, PDC_CHASSIS_INFO,
&pdc_chassis_info, &pdc_chassis_lcd, sizeof(pdc_chassis_lcd)) &&
pdc_chassis_lcd.enabled) {
memset(&nca, 0, sizeof(nca));
memset(&nca, 0, sizeof(nca));
err = pdcproc_chassis_info(&pdc_chassis_info, &nca.ca_pcl);
if (!err && nca.ca_pcl.enabled) {
nca.ca_name = "lcd";
nca.ca_dp.dp_bc[0] = nca.ca_dp.dp_bc[1] = nca.ca_dp.dp_bc[2] =
nca.ca_dp.dp_bc[3] = nca.ca_dp.dp_bc[4] = nca.ca_dp.dp_bc[5] = -1;
nca.ca_dp.dp_mod = -1;
nca.ca_irq = -1;
nca.ca_iot = &hppa_bustag;
nca.ca_hpa = pdc_chassis_lcd.cmd_addr;
nca.ca_pdc_iodc_read = (void *)&pdc_chassis_lcd;
nca.ca_hpa = nca.ca_pcl.cmd_addr;
config_found(self, &nca, mbprint);
}

View File

@ -1,4 +1,4 @@
/* $NetBSD: autoconf.h,v 1.14 2011/01/03 19:20:11 skrll Exp $ */
/* $NetBSD: autoconf.h,v 1.15 2011/01/04 10:42:34 skrll Exp $ */
/* $OpenBSD: autoconf.h,v 1.10 2001/05/05 22:33:42 art Exp $ */
@ -33,14 +33,23 @@
#include <machine/bus.h>
#include <machine/pdc.h>
/* 16 should be enough for anyone */
#define HP700_MAXIOADDRS 16
struct confargs {
struct iodc_data ca_type PDC_ALIGNMENT; /* iodc-specific type descrition */
struct iodc_data ca_type; /* iodc-specific type descrition */
struct device_path ca_dp; /* device_path as found by pdc_scan */
struct pdc_iodc_read *ca_pdc_iodc_read;
union {
struct pdc_iodc_read uca_pir;
struct pdc_chassis_lcd uca_pcl;
} ca_u;
#define ca_pir ca_u.uca_pir
#define ca_pcl ca_u.uca_pcl
struct {
hppa_hpa_t addr;
u_int size;
} ca_addrs[16]; /* 16 is ought to be enough */
} ca_addrs[HP700_MAXIOADDRS];
const char *ca_name; /* device name/description */
bus_space_tag_t ca_iot; /* io tag */
int ca_mod; /* module number on the bus */

View File

@ -1,4 +1,4 @@
/* $NetBSD: pdc.h,v 1.16 2010/12/12 08:23:15 skrll Exp $ */
/* $NetBSD: pdc.h,v 1.17 2011/01/04 10:42:34 skrll Exp $ */
/* $OpenBSD: pdc.h,v 1.35 2007/07/15 20:03:48 kettenis Exp $ */
@ -335,13 +335,15 @@ struct device_path {
#define PZL_ENCODE(bits, parity, speed) \
(((bits) - 5) & 0x03) | (((parity) & 0x3) << 3) | \
(((speed) & 0x0f) << 6)
};
struct pdc_result { /* general result buffer */
u_int result[32];
};
struct pdc_pim { /* PDC_PIM */
u_int count; /* actual (HPMC, LPMC) or total (SIZE) count */
u_int archsize; /* size of architected regions (see "pim.h") */
u_int filler[30];
};
struct pdc_model { /* PDC_MODEL */
@ -362,22 +364,18 @@ struct pdc_model { /* PDC_MODEL */
u_int arch_rev; /* architecture revision */
u_int pot_key; /* potential key */
u_int curr_key; /* current key */
int filler1;
u_int filler2[22];
};
struct pdc_cpuid { /* PDC_MODEL, PDC_CPUID */
u_int reserved : 20;
u_int version : 7; /* CPU version */
u_int revision : 5; /* CPU revision */
u_int filler[31];
};
struct pdc_getbootopts { /* PDC_MODEL_GETBOOTOPTS */
u_int cur_test; /* current enabled tests */
u_int sup_test; /* supported tests */
u_int def_test; /* default enabled tests */
u_int filler[29];
};
struct cache_cf { /* PDC_CACHE (for "struct pdc_cache") */
@ -448,14 +446,12 @@ struct pdc_cache { /* PDC_CACHE */
u_int dt_off_stride; /* offset incr per off_count iteration (flush)*/
u_int dt_off_count; /* number of dt_loop iterations/space (flush) */
u_int dt_loop; /* number of PDTLBE's per off_stride (flush) */
u_int filler[2];
};
struct pdc_spidb { /* PDC_CACHE, PDC_CACHE_GETSPIDB */
u_int spidR1 : 4;
u_int spidbits : 12;
u_int spidR2 : 16;
u_int filler[31];
};
struct pdc_cst {
@ -473,13 +469,10 @@ struct pdc_coherence { /* PDC_CACHE, PDC_CACHE_SETCS */
#define ita_cst ita.cst
struct pdc_cst dta;
#define dta_cst dta.cst
u_int filler[28];
};
struct pdc_hpa { /* PDC_HPA */
hppa_hpa_t hpa; /* HPA of processor */
int filler1;
u_int filler2[30];
};
struct pdc_coproc { /* PDC_COPROC */
@ -488,13 +481,11 @@ struct pdc_coproc { /* PDC_COPROC */
u_int pad[15];
u_int fpu_revision;
u_int fpu_model;
u_int filler2[13];
};
struct pdc_tod { /* PDC_TOD, PDC_TOD_READ */
u_int sec; /* elapsed time since 00:00:00 GMT, 1/1/70 */
u_int usec; /* accurate to microseconds */
u_int filler2[30];
};
struct pdc_itimer { /* PDC_TOD_ITIMER */
@ -502,7 +493,6 @@ struct pdc_itimer { /* PDC_TOD_ITIMER */
u_int calib1;
u_int tod_acc; /* TOD accuracy in 1e-9 part */
u_int cr_acc; /* itmr accuracy in 1e-9 parts */
u_int filler[28];
};
struct pdc_nvm { /* PDC_NVM */
@ -517,8 +507,6 @@ struct pdc_nvm { /* PDC_NVM */
struct pdc_instr { /* PDC_INSTR */
u_int instr; /* instruction that invokes PDC mchk entry pt */
int filler1;
u_int filler2[30];
};
struct pdc_iodc_read { /* PDC_IODC, PDC_IODC_READ */
@ -532,7 +520,6 @@ struct pdc_iodc_minit { /* PDC_IODC, PDC_IODC_NINIT or PDC_IODC_DINIT */
u_int max_spa; /* size of SPA (in bytes) > max_mem+map_mem */
u_int max_mem; /* size of "implemented" memory (in bytes) */
u_int map_mem; /* size of "mappable-only" memory (in bytes) */
u_int filler[28];
};
struct btlb_info { /* for "struct pdc_btlb" (PDC_BTLB) */
@ -547,24 +534,20 @@ struct pdc_btlb { /* PDC_BLOCK_TLB */
u_int max_size; /* Max size in pages */
struct btlb_info finfo; /* Fixed range info */
struct btlb_info vinfo; /* Variable range info */
u_int filler[28];
};
struct pdc_hwtlb { /* PDC_TLB */
u_int min_size; /* What do these mean? */
u_int max_size;
u_int filler[30];
};
struct pdc_power_info { /* PDC_SOFT_POWER_INFO */
u_int addr; /* power register address */
u_int filler[31];
};
struct pdc_pat_cell_id { /* PDC_PAT_CELL_GETID */
u_long id; /* cell id */
u_long loc; /* cell location */
u_long filler[14];
};
struct pdc_pat_cell_module { /* PDC_PAT_CELL_MODULE */
@ -581,7 +564,6 @@ struct pdc_pat_cell_module { /* PDC_PAT_CELL_MODULE */
struct pdc_pat_io_num { /* PDC_PAT_IO */
u_int num;
u_int filler[31];
};
struct pdc_pat_pci_rt { /* PDC_PAT_IO_GET_PCI_RT */
@ -599,7 +581,6 @@ struct pdc_pat_pci_rt { /* PDC_PAT_IO_GET_PCI_RT */
struct pdc_memmap { /* PDC_MEMMAP */
u_int hpa; /* HPA for module */
u_int morepages; /* additional IO pages */
u_int filler[30];
};
struct pdc_system_map_find_mod { /* PDC_SYSTEM_MAP_FIND_MOD */
@ -607,19 +588,15 @@ struct pdc_system_map_find_mod { /* PDC_SYSTEM_MAP_FIND_MOD */
u_int size; /* pages */
u_int naddrs;
u_int mod_index;
u_int filler[28];
};
struct pdc_system_map_find_addr { /* PDC_SYSTEM_MAP_FIND_ADDR */
u_int hpa;
u_int size; /* pages */
u_int filler[30];
};
struct pdc_lan_station_id { /* PDC_LAN_STATION_ID */
uint8_t addr[6];
uint8_t filler1[2];
u_int filler2[30];
};
/*
@ -665,7 +642,6 @@ struct pdc_lan_station_id { /* PDC_LAN_STATION_ID */
struct pdc_chassis_info {
u_int size;
u_int max_size;
u_int filler[30];
};
struct pdc_chassis_lcd {
@ -678,7 +654,6 @@ struct pdc_chassis_lcd {
uint8_t enabled;
uint8_t heartbeat[3];
uint8_t disk[3];
u_int filler[25];
};
/*
@ -788,6 +763,57 @@ void pdccninit(struct consdev *);
int pdccngetc(dev_t);
void pdccnputc(dev_t, int);
void pdccnpollc(dev_t, int);
int pdcproc_chassis_display(unsigned long);
int pdcproc_chassis_info(struct pdc_chassis_info *, struct pdc_chassis_lcd *);
int pdcproc_pim(int, struct pdc_pim *, void **, size_t *);
int pdcproc_model_info(struct pdc_model *);
int pdcproc_model_cpuid(struct pdc_cpuid *);
int pdcproc_cache(struct pdc_cache *);
int pdcproc_cache_coherence(struct pdc_coherence *);
int pdcproc_cache_spidbits(struct pdc_spidb *);
int pdcproc_hpa_processor(hppa_hpa_t *);
int pdcproc_coproc(struct pdc_coproc *);
int pdcproc_iodc_read(hppa_hpa_t, int, int *, struct pdc_iodc_read *, size_t,
struct iodc_data *, size_t);
int pdcproc_iodc_ninit(struct pdc_iodc_minit *, hppa_hpa_t, int);
int pdcproc_instr(unsigned int *);
int pdcproc_block_tlb(struct pdc_btlb *);
int pdcproc_btlb_insert(pa_space_t, vaddr_t, paddr_t, vsize_t, u_int, int);
int pdcproc_btlb_purge(pa_space_t, vaddr_t, paddr_t, vsize_t);
int pdcproc_btlb_purgeall(void);
int pdcproc_tlb_info(struct pdc_hwtlb *);
int pdcproc_tlb_config(struct pdc_hwtlb *, vaddr_t, vsize_t, unsigned long);
int pdcproc_system_map_find_mod(struct pdc_system_map_find_mod *,
struct device_path *, int);
int pdcproc_system_map_find_addr(struct pdc_system_map_find_addr *, int, int);
int pdcproc_system_map_trans_path(struct pdc_memmap *, struct device_path *);
int pdcproc_soft_power_enable(int);
int pdcproc_soft_power_info(struct pdc_power_info *);
int pdcproc_memmap(struct pdc_memmap *, struct device_path *);
int pdcproc_ioclrerrors(void);
int pdcproc_ioreset(void);
int pdcproc_doreset(void);
int pdcproc_lan_station_id(char *, size_t, hppa_hpa_t);
int pdcproc_pci_inttblsz(int *);
int pdcproc_pci_gettable(int, size_t, void *);
#endif
#endif /* !(_LOCORE) */