Module Name:    src
Committed By:   tsutsui
Date:           Thu May  9 15:11:11 UTC 2024

Modified Files:
        src/sys/arch/hp300/stand/common: conf.c conf.h devopen.c scsi.c
            scsireg.h scsivar.h sd.c

Log Message:
Add a preliminary CD boot support to uboot for preparation of PR/54455.

Briefly tested on mame, but not enalbed yet.


To generate a diff of this commit:
cvs rdiff -u -r1.14 -r1.15 src/sys/arch/hp300/stand/common/conf.c \
    src/sys/arch/hp300/stand/common/devopen.c
cvs rdiff -u -r1.3 -r1.4 src/sys/arch/hp300/stand/common/conf.h
cvs rdiff -u -r1.12 -r1.13 src/sys/arch/hp300/stand/common/scsi.c \
    src/sys/arch/hp300/stand/common/sd.c
cvs rdiff -u -r1.5 -r1.6 src/sys/arch/hp300/stand/common/scsireg.h
cvs rdiff -u -r1.4 -r1.5 src/sys/arch/hp300/stand/common/scsivar.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/hp300/stand/common/conf.c
diff -u src/sys/arch/hp300/stand/common/conf.c:1.14 src/sys/arch/hp300/stand/common/conf.c:1.15
--- src/sys/arch/hp300/stand/common/conf.c:1.14	Sun Dec 11 07:39:30 2022
+++ src/sys/arch/hp300/stand/common/conf.c	Thu May  9 15:11:11 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: conf.c,v 1.14 2022/12/11 07:39:30 tsutsui Exp $	*/
+/*	$NetBSD: conf.c,v 1.15 2024/05/09 15:11:11 tsutsui Exp $	*/
 
 /*
  * Copyright (c) 1982, 1986, 1990, 1993
@@ -41,6 +41,7 @@
 #include <lib/libsa/stand.h>
 #include <lib/libsa/nfs.h>
 #include <lib/libsa/ufs.h>
+#include <lib/libsa/cd9660.h>
 
 #include <hp300/stand/common/conf.h>
 #include <hp300/stand/common/rawfs.h>
@@ -138,13 +139,16 @@ int	npunit = __arraycount(punitsw);
  * Filesystem configuration
  */
 struct fs_ops file_system_rawfs[1] = { FS_OPS(rawfs) };
-struct fs_ops file_system_ufs[NFSYS_UFS] = {
+struct fs_ops file_system_ufs[NFSYS_FS] = {
 	FS_OPS(ffsv1),
 #ifdef SUPPORT_UFS2
 	FS_OPS(ffsv2),
 #endif
+#ifdef SUPPORT_CD
+	FS_OPS(cd9660),
+#endif
 };
 struct fs_ops file_system_nfs[1] = { FS_OPS(nfs) };
 
-struct fs_ops file_system[NFSYS_UFS];
+struct fs_ops file_system[NFSYS_FS];
 int	nfsys = 1;		/* default value; should be overrieded */
Index: src/sys/arch/hp300/stand/common/devopen.c
diff -u src/sys/arch/hp300/stand/common/devopen.c:1.14 src/sys/arch/hp300/stand/common/devopen.c:1.15
--- src/sys/arch/hp300/stand/common/devopen.c:1.14	Sun Jan 15 06:19:46 2023
+++ src/sys/arch/hp300/stand/common/devopen.c	Thu May  9 15:11:11 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: devopen.c,v 1.14 2023/01/15 06:19:46 tsutsui Exp $	*/
+/*	$NetBSD: devopen.c,v 1.15 2024/05/09 15:11:11 tsutsui Exp $	*/
 
 /*-
  * Copyright (c) 1996, 1997 The NetBSD Foundation, Inc.
@@ -105,7 +105,7 @@ devlookup(const char *d, int len)
 			case 4:	/* sd */
 				memcpy(file_system, file_system_ufs,
 				    sizeof(file_system_ufs));
-				nfsys = NFSYS_UFS;
+				nfsys = NFSYS_FS;
 				break;
 
 			case 6:	/* le */
@@ -263,7 +263,7 @@ devopen(struct open_file *f, const char 
 	case 4:		/* sd */
 		memcpy(file_system, file_system_ufs,
 		    sizeof(file_system_ufs));
-		nfsys = NFSYS_UFS;
+		nfsys = NFSYS_FS;
 		break;
 
 	case 6:		/* le */

Index: src/sys/arch/hp300/stand/common/conf.h
diff -u src/sys/arch/hp300/stand/common/conf.h:1.3 src/sys/arch/hp300/stand/common/conf.h:1.4
--- src/sys/arch/hp300/stand/common/conf.h:1.3	Sun Dec 11 07:39:30 2022
+++ src/sys/arch/hp300/stand/common/conf.h	Thu May  9 15:11:11 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: conf.h,v 1.3 2022/12/11 07:39:30 tsutsui Exp $	*/
+/*	$NetBSD: conf.h,v 1.4 2024/05/09 15:11:11 tsutsui Exp $	*/
 
 /*
  * Copyright (c) 1982, 1990, 1993
@@ -53,10 +53,16 @@ int sdopen(struct open_file *, ...);
 int sdclose(struct open_file *);
 #endif
 #ifdef SUPPORT_UFS2
-#define NFSYS_UFS	2
+#define NFSYS_UFS2	1
 #else
-#define NFSYS_UFS	1
+#define NFSYS_UFS2	0
 #endif
+#ifdef SUPPORT_CD
+#define NFSYS_CD9660	1
+#else
+#define NFSYS_CD9660	0
+#endif
+#define NFSYS_FS	(1 + NFSYS_UFS2 + NFSYS_CD9660)
 
 #ifdef SUPPORT_ETHERNET
 extern struct netif_driver le_driver;
@@ -72,5 +78,5 @@ extern	struct punitsw punitsw[];
 extern	int npunit;
 
 extern	struct fs_ops file_system_rawfs[1];
-extern	struct fs_ops file_system_ufs[NFSYS_UFS];
+extern	struct fs_ops file_system_ufs[NFSYS_FS];
 extern	struct fs_ops file_system_nfs[1];

Index: src/sys/arch/hp300/stand/common/scsi.c
diff -u src/sys/arch/hp300/stand/common/scsi.c:1.12 src/sys/arch/hp300/stand/common/scsi.c:1.13
--- src/sys/arch/hp300/stand/common/scsi.c:1.12	Sun Jan 15 06:19:46 2023
+++ src/sys/arch/hp300/stand/common/scsi.c	Thu May  9 15:11:11 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: scsi.c,v 1.12 2023/01/15 06:19:46 tsutsui Exp $	*/
+/*	$NetBSD: scsi.c,v 1.13 2024/05/09 15:11:11 tsutsui Exp $	*/
 
 /*
  * This is reported to fix some odd failures when disklabeling
@@ -400,6 +400,19 @@ scsi_read_capacity(int ctlr, int slave, 
 	    DATA_IN_PHASE);
 }
 
+#ifdef SUPPORT_CD
+int
+scsi_inquiry(int ctlr, int slave, uint8_t *buf, unsigned int len)
+{
+	struct scsi_softc *hs = &scsi_softc[ctlr];
+	static struct scsi_cdb6 cdb = { CMD_INQUIRY };
+
+	cdb.len = len;
+	return scsiicmd(hs, slave, (uint8_t *)&cdb, sizeof(cdb), buf, len,
+	    DATA_IN_PHASE);
+}
+#endif
+
 int
 scsi_tt_read(int ctlr, int slave, uint8_t *buf, u_int len, daddr_t blk,
     u_int nblk)
Index: src/sys/arch/hp300/stand/common/sd.c
diff -u src/sys/arch/hp300/stand/common/sd.c:1.12 src/sys/arch/hp300/stand/common/sd.c:1.13
--- src/sys/arch/hp300/stand/common/sd.c:1.12	Sun Jan 15 06:19:46 2023
+++ src/sys/arch/hp300/stand/common/sd.c	Thu May  9 15:11:11 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: sd.c,v 1.12 2023/01/15 06:19:46 tsutsui Exp $	*/
+/*	$NetBSD: sd.c,v 1.13 2024/05/09 15:11:11 tsutsui Exp $	*/
 
 /*
  * Copyright (c) 1988 University of Utah.
@@ -67,6 +67,9 @@ struct	sd_softc {
 	char	sc_alive;
 	short	sc_blkshift;
 	struct	sdminilabel sc_pinfo;
+#ifdef SUPPORT_CD
+	uint8_t	sc_type;
+#endif
 };
 
 #define	SDRETRY		2
@@ -82,6 +85,9 @@ sdinit(int ctlr, int unit)
 {
 	struct sd_softc *ss = &sd_softc[ctlr][unit];
 	u_char stat;
+#ifdef SUPPORT_CD
+	struct scsi_inquiry inqbuf;
+#endif
 	int capbuf[2];
 
 	stat = scsi_test_unit_rdy(ctlr, unit);
@@ -97,6 +103,20 @@ sdinit(int ctlr, int unit)
 			return 0;
 		}
 	}
+#ifdef SUPPORT_CD
+	/*
+	 * try to get the disk type.
+	 */
+	memset(&inqbuf, 0, sizeof(inqbuf));
+	stat = scsi_inquiry(ctlr, unit, (u_char *)&inqbuf, sizeof(inqbuf));
+	if (stat == 0) {
+		/* to fake a disklabel on CD-ROM */
+		ss->sc_type = inqbuf.type & SID_TYPE;
+	} else {
+		/* assume a disk by default */
+		ss->sc_type = T_DIRECT;
+	}
+#endif
 	/*
 	 * try to get the drive block size.
 	 */
@@ -141,11 +161,22 @@ sdgetinfo(struct sd_softc *ss)
 
 	msg = getdisklabel(io_buf, lp);
 	if (msg) {
-		printf("sd(%d,%d,%d): WARNING: %s\n",
-		       ss->sc_ctlr, ss->sc_unit, ss->sc_part, msg);
-		pi->npart = 3;
-		pi->offset[0] = pi->offset[1] = -1;
-		pi->offset[2] = 0;
+#ifdef SUPPORT_CD
+		if (ss->sc_type == T_CDROM) {
+			/* assume a whole disk region is ISO9660 */
+			pi->npart = 3;
+			pi->offset[0] = 0;
+			pi->offset[1] = -1;
+			pi->offset[2] = 0;
+		} else
+#endif
+		{
+			printf("sd(%d,%d,%d): WARNING: %s\n",
+			    ss->sc_ctlr, ss->sc_unit, ss->sc_part, msg);
+			pi->npart = 3;
+			pi->offset[0] = pi->offset[1] = -1;
+			pi->offset[2] = 0;
+		}
 	} else {
 		pi->npart = lp->d_npartitions;
 		for (i = 0; i < pi->npart; i++)

Index: src/sys/arch/hp300/stand/common/scsireg.h
diff -u src/sys/arch/hp300/stand/common/scsireg.h:1.5 src/sys/arch/hp300/stand/common/scsireg.h:1.6
--- src/sys/arch/hp300/stand/common/scsireg.h:1.5	Sun Jan 15 06:19:46 2023
+++ src/sys/arch/hp300/stand/common/scsireg.h	Thu May  9 15:11:11 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: scsireg.h,v 1.5 2023/01/15 06:19:46 tsutsui Exp $	*/
+/*	$NetBSD: scsireg.h,v 1.6 2024/05/09 15:11:11 tsutsui Exp $	*/
 
 /*
  * Copyright (c) 1990, 1993
@@ -274,6 +274,9 @@ struct scsi_xsense {
 /* inquiry data */
 struct scsi_inquiry {
 	u_char	type;
+#define SID_TYPE	0x1f
+#define T_DIRECT	0x00
+#define T_CDROM		0x05
 	u_char	qual;
 	u_char	version;
 	u_char	rsvd;

Index: src/sys/arch/hp300/stand/common/scsivar.h
diff -u src/sys/arch/hp300/stand/common/scsivar.h:1.4 src/sys/arch/hp300/stand/common/scsivar.h:1.5
--- src/sys/arch/hp300/stand/common/scsivar.h:1.4	Sun Dec 11 12:17:19 2005
+++ src/sys/arch/hp300/stand/common/scsivar.h	Thu May  9 15:11:11 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: scsivar.h,v 1.4 2005/12/11 12:17:19 christos Exp $	*/
+/*	$NetBSD: scsivar.h,v 1.5 2024/05/09 15:11:11 tsutsui Exp $	*/
 
 /*
  * Copyright (c) 1982, 1990, 1993
@@ -52,5 +52,6 @@ void scsiabort(struct scsi_softc *, vola
 int scsi_test_unit_rdy(int, int);
 int scsi_request_sense(int, int, u_char *, unsigned int);
 int scsi_read_capacity(int, int, u_char *, unsigned int);
+int scsi_inquiry(int, int, u_char *, unsigned int);
 int scsi_tt_read(int, int, u_char *, u_int, daddr_t, u_int);
 int scsi_tt_write(int, int, u_char *, u_int, daddr_t, u_int);

Reply via email to